フラクタル曲線

by gaziya
♥2 | Line 102 | Modified 2011-11-07 23:01:17 | MIT License
play

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
    }
}