Koch paint

by smallwind1912
♥0 | Line 123 | Modified 2011-07-13 23:05:06 | MIT License
play

ActionScript3 source code

/**
 * Copyright smallwind1912 ( http://wonderfl.net/user/smallwind1912 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/i0vm
 */

package {

    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    
    [SWF(backgroundColor=0x000000, width=465, height=456, frameRate=30)]
    public class FlashTest extends Sprite {
        private var numKoch:Number=20;
        private var start:Number = 0;
        public function FlashTest() {
            
            // hi it use kock to paint some thing 
            // it not't good for performance
            // write as3 code here..
            start = 0;
            paint(null);
            var t:Timer = new Timer(5000,5);
            t.addEventListener(TimerEvent.TIMER, paint);
            t.start();
        }
        private function paint(e:TimerEvent):void 
        {
            var erase:uint;
            if (start % 2!=0)
                erase = 1;
            else erase = 0;
            //trace(start+"  "+erase);
            for (var i:int = 0; i < numKoch; i++) 
            {
                //erase to use erase kock with black color
                var k:Koch = new Koch(4, 120, i*numKoch,erase);
                k.x = i * Math.cos((i * numKoch ) * 0.017) + 200;
                k.y = i * Math.sin((i * numKoch ) * 0.017) +150;
                k.cacheAsBitmap = true;
                addChild(k);
            }
            start++;
        }
    }
}

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    
    /**
     * ...
     * @author ...
     */
    internal class Koch extends MovieClip
    {
        private var length:Number;
        private var direction:Number;
        private var num:int
        private var _curX:Number;
        private var _curY:Number;
        private var l0:Number;
        private var state:Number;
        private var curN:Number;
        private var earse:Number;
        private var numPaint:Number;
        private var Color:Array = [0x000000,0xD2D200,0xF9F900,0xFFFF37,0xFFFF9D ];
        
        public function Koch(n:int,l:Number,d:Number,e:uint) 
        {
            length = l;
            num = n;
            direction = d;
            graphics.moveTo(0, 0);
            l0 = l / Math.pow(3, n);
            _curX = 0;
            _curY = 0;
            state = 0;
            curN = 0;
            earse = e;
            //paintKoch(num, length, direction);
            this.addEventListener(Event.ENTER_FRAME, createKoch);
            numPaint = Math.pow(4, n);

        }
        
        //private function paintKoch(n:int,l:Number,d:Number) :void
        //{
        //
            //if (n>0) 
            //{
                //paintKoch(n - 1, l / 3, d);
                //d +=60;
                //paintKoch(n - 1, l / 3, d);
                //d -= 120;
                //paintKoch(n - 1, l / 3, d);
                //d += 60;
                //paintKoch(n - 1, l / 3, d);    
            //}
            //else {
                //curX += l * Math.cos(d * 0.01745329292 );
                //curY += l * Math.sin(d * 0.01745329292 );
                //graphics.lineTo(curX,curY);
            //}
        //}
        private function createKoch(e:Event):void 
        {
            var angle:Number=getAngle(state);
            state++;
            if (earse) graphics.lineStyle(4, 0xFF000000);
            else graphics.lineStyle(2, state*1000+0xE41B1B);
            _curX += l0 * Math.cos( (direction+angle)* 0.01745329292);
            _curY += l0 * Math.sin((direction+angle)* 0.01745329292);
            graphics.lineTo(_curX, _curY);
            if (state == numPaint) {
                this.removeEventListener(Event.ENTER_FRAME, createKoch);
            }
            
        }
        private function getAngle(value:Number) :Number
        {
            var angle:int=0;
            if (value >= 4) {
                switch(value%4) {
                    case 1:
                    angle+= 60; break;
                    case 2:
                    angle-= 60; break;
                    default:
                    angle += 0;
                    break;
                }
                angle+=getAngle( Math.floor(value / 4));    
            }
            else{
                switch(value) {
                    case 1:
                    angle+= 60; break;
                    case 2:
                    angle-= 60; break;
                    default:
                    angle += 0;
                    break;
                }
            }
            return angle;
        }
        
        public function get curY():Number { 
            return localToGlobal(new Point(_curX, _curY)).y; 
        }
        
        
        public function get curX():Number {
            return localToGlobal(new Point(_curX, _curY)).x; 
        }
        
        public function set curX(value:Number):void 
        {
            _curX = value;
        }
        
        public function set curY(value:Number):void 
        {
            _curY = value;
        }
        
    }