forked from: forked from: Triple Pendulum in QuickBox2D

by ohisama forked from forked from: Triple Pendulum in QuickBox2D (diff: 40)
♥0 | Line 73 | Modified 2013-02-26 12:58:45 | MIT License
play

ActionScript3 source code

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

// forked from elbib's forked from: Triple Pendulum in QuickBox2D
// forked from makc3d's Triple Pendulum in QuickBox2D
// forked from makc3d's Double Pendulum in QuickBox2D
// forked from makc3d's forked from: Double Pendulum Symplectic Euler
// forked from aont's Double Pendulum
package 
{
    import com.actionsnippet.qbox.*;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.utils.Timer;
    [SWF(backgroundColor=0x3f7f00)]
    public class TriplePendulum extends MovieClip
    {
        private var circle : Sprite;
        private var circleObject : QuickObject;
        private var circleCoords : Array = [];
        private var line_ratio : Number;
        private var length_1 : Number = 0.5;
        private var length_2 : Number = 0.25;
        private var radius : Number = 2;
        private var mass_1 : Number = 0.005;
        private var mass_2 : Number = 0.001;
        private var color_3 : Number = 0xff7f00;
        private var center : Number;
        private var bd : BitmapData;
        private var ct : ColorTransform;
        public function TriplePendulum()
        {
            this.center = 230;
            this.line_ratio = center / (this.length_1 + 1.6 * this.length_2);
            bd = new BitmapData (465, 465, true, 0); 
            addChild(new Bitmap (bd));
            ct = new ColorTransform; 
            ct.color = color_3;
            ct.alphaMultiplier = 1 - 1e-3;
            circle = new Sprite; circle.graphics.beginFill (0xffffff);
            circle.graphics.drawCircle(0, 0, radius);
            var sim : QuickBox2D = new QuickBox2D(this, {debug : false});
            var circleA : QuickObject = sim.addCircle({x : 465 / 2 / 30, y : 465 / 2 / 30, radius : 6 / 30, density : 0});
            var circleB : QuickObject = sim.addCircle({x : 465 / 2 / 30, y : (465 / 2 + this.length_1 * line_ratio)/30, radius : 6 / 30, density : mass_1});
            var circleC : QuickObject = sim.addCircle({x : 465 / 2 / 30, y : (465 / 2 + (this.length_1 + this.length_2) * line_ratio) / 30, radius : 6 / 30, density : mass_2});
            circleObject = sim.addCircle({x : 465 / 2 / 30, y : (465 / 2 + (this.length_1 + 1.6 * this.length_2) * line_ratio) / 30, radius : 6 / 30, density : mass_2 * mass_2 / mass_1});
            sim.addJoint({type : "distance", a : circleA.body, b : circleB.body});
            sim.addJoint({type : "distance", a : circleB.body, b : circleC.body});
            sim.addJoint({type : "distance", a : circleC.body, b : circleObject.body});
            sim.start();
            sim.mouseDrag();
            addEventListener(Event.ENTER_FRAME, ReDraw);
        }
        private function ReDraw(e : Event = null) : void
        {
            if (circleCoords.length == 4) circleCoords.shift ();
            while (circleCoords.length != 4) circleCoords.push (new Point (circleObject.x*30, circleObject.y*30));
            var m : Matrix = new Matrix, n : Number = 40 / radius;
            for (var i : int = 1; i < n + 1; i++) 
            {
                var p : Point = spline (circleCoords [0], circleCoords [1], circleCoords [2], circleCoords [3], i / n);
                m.tx = p.x; 
                m.ty = p.y;
                bd.draw(circle, m);
            }
            bd.colorTransform(bd.rect, ct);
        }
        private function spline(p0 : Point, p1 : Point, p2 : Point, p3 : Point, t : Number) : Point 
        {   
            return new Point(0.5 * ((2 * p1.x) + t * ((-p0.x + p2.x) + t * ((2 * p0.x - 5 * p1.x + 4 * p2.x - p3.x) + t * ( -p0.x + 3 * p1.x - 3 * p2.x + p3.x)))), 0.5 * ((2 * p1.y) + t * ((-p0.y + p2.y) + t * ((2 * p0.y - 5 * p1.y + 4 * p2.y - p3.y) + t * (-p0.y + 3 * p1.y - 3 * p2.y + p3.y)))));
        }
    }
}