lorenz attractor

by freddy
♥0 | Line 73 | Modified 2011-11-06 15:19:49 | MIT License
play

ActionScript3 source code

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

package {
    import flash.display.Sprite;
    import flash.display.Shape;
    public class FlashTest extends Sprite {
        public function FlashTest() {
            var child:Sprite=new Sprite();
            child.graphics.beginFill(0xffffff);
            child.graphics.drawRect(0,0,480,480);
            child.graphics.endFill();
            child.graphics.lineStyle(0,0xFF0000, 0.1);
            
            addChild(child);
            
            var cx:int = 240;
            var cy:int = 240;
            var m:Number = 10;
            var c:Number = 5;
            var startTime:int;
            var i:int;
            var j:int;
            var fl:Function;
            var y:Array = new Array(3);
            var yy:Array = new Array(3);
            var rk:Function = rungeKutta(3);
            
            fl = (function(p:Number, r:Number, b:Number):Function {
                return function(t:Number, y:Array):Array {
                    return [
                        -p * y[0] + p * y[1],
                        -y[0] * y[2] + r * y[0] - y[1],
                        y[0] * y[1] - b * y[2]
                    ]
                }
            })(10, 28, 8/3);
            
            for(i=0; i<3; i++) {
                y[i] = 1.0;
            }
            child.graphics.moveTo((int)(y[0]*m)+cx, (int)(y[1]*m)+cy);
            for(i=0; i<100000; i++) {
                rk(i/100.0, y, 0.01, fl, yy);
                child.graphics.lineTo((int)(yy[0]*m)+cx, (int)(yy[1]*m)+cy);
                child.graphics.moveTo((int)(yy[0]*m)+cx, (int)(yy[1]*m)+cy);
                var arr:Array = y;
                y = yy;
                yy = arr;
            }
        }
        
        public function rungeKutta(size:int):Function {
            var yy:Array = new Array(size);
            var len:int = size;
            
            return function(t:Number, y:Array, h:Number, f:Function, yo:Array):void {
                var i:int;
                
                var k1:Array = f(t, y);
                for(i=0; i<len; i++) {
                    k1[i] *= h;
                    yy[i] = y[i]+k1[i]/2.0;
                }
                var k2:Array = f(t+h/2.0, yy);
                for(i=0; i<len; i++) {
                    k2[i] *= h;
                    yy[i] = y[i]+k2[i]/2.0;
                }
                var k3:Array = f(t+h/2.0, yy);
                for(i=0; i<len; i++) {
                    k3[i] *= h;
                    yy[i] = y[i]+k3[i];
                }
                var k4:Array = f(t+h, yy);
                for(i=0; i<len; i++) {
                    k4[i] *= h;
                    yo[i] = y[i]+(k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6.0;
                }
            }
        }
    }
}