フラクタル曲線
♥2 |
Line 102 |
Modified 2011-11-07 23:01:17 |
MIT License
archived:2017-03-20 08:57:16
ActionScript3 source code
/**
* Copyright gaziya ( http://wonderfl.net/user/gaziya )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/dgwd
*/
package {
import flash.display.Sprite
import flash.utils.setInterval
[SWF(width=465,height=465,frameRate=30)]
public class FlashTest extends Sprite {
public function FlashTest() {
x = stage.stageWidth/2
y = stage.stageHeight/2
var koch:Koch = new Koch(150)
addChild(koch)
setInterval(function():void{koch.update()},800)
}
}
}
import flash.display.Sprite;
import flash.geom.Matrix
import flash.geom.Point
class Koch extends Sprite {
private var _radius:int
private var _rate:Vector.<Number>, _theta:Vector.<Number>
public function Koch(radius:int) {
_radius = radius
update()
}
public function update():void {
var cornar:int = Math.floor(Math.random()*3)+3
var polygon:RegularPolygon = new RegularPolygon(_radius)
var points:Vector.<Point> = polygon.points(cornar)
var cornarPoints:Vector.<Point> = new Vector.<Point>
var offset:Number = 0.1
var i:int
for (i=0; i<3; i++){
cornarPoints.push(new Point(
Math.random()*0.3+offset,
(Math.random()-0.5)*1.2 ))
offset += 0.25
}
setCornarPoints(cornarPoints)
for ( i=0; i<4; i++) {
points = growPoints(points)
}
graphics.clear()
graphics.lineStyle(2,0x000000)
graphics.beginFill(0xf0a000)
for(i=0; i < points.length; i++){
if (i==0){
graphics.moveTo(points[i].x, points[i].y)
}else{
graphics.lineTo(points[i].x, points[i].y)
}
}
rotationX = (Math.random()-0.5)*90
rotationY = (Math.random()-0.5)*90
rotationZ = (Math.random()-0.5)*90
}
private function setCornarPoints(points:Vector.<Point>):void {
_rate = new Vector.<Number>
_theta = new Vector.<Number>
for each(var value:Point in points){
_rate.push(Math.sqrt(value.x*value.x+value.y*value.y))
_theta.push(Math.atan2(value.y,value.x))
}
}
private function growPoints(points:Vector.<Point>):Vector.<Point> {
var bp:Point = null
var ep:Point = null
var buf:Vector.<Point> = new Vector.<Point>()
for each(var value:Point in points){
bp = ep
ep = value
if (bp != null) {
for (var i:int = 0; i < 3; i++) {
var matrix:Matrix = new Matrix()
matrix.translate(-bp.x,-bp.y)
matrix.scale(_rate[i], _rate[i])
matrix.rotate(_theta[i])
matrix.translate(bp.x,bp.y)
buf.push(matrix.transformPoint(ep))
}
}
buf.push(ep)
}
return buf
}
}
class RegularPolygon {
private var _radius:int
public function RegularPolygon(radius:int) {
_radius = radius
}
public function points(cornar:int):Vector.<Point> {
var buf:Vector.<Point> = new Vector.<Point>()
var theta:Number = Math.PI / 2
var step:Number = Math.PI * 2 /cornar
for (var i:int; i < cornar; i++) {
buf.push(new Point(_radius * Math.cos(theta), -_radius * Math.sin(theta)))
theta += step
}
buf.push(buf[0])
return buf
}
}