Forked from: makc3d's forked from: Double Pendulum Symplectic Euler diff:129 Double Pendulum in QuickBox2D makc3d forked:5favorite:4lines:77license : MIT License modified : 2010-03-13 18:07:29 Embed Tweet // 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 DoublePendulum 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.05; private var mass_2:Number = 0.01; private var color_3:Number = 0xff7f00; private var center:Number; private var bd:BitmapData; private var ct:ColorTransform; public function DoublePendulum() { this.center = 230; this.line_ratio = center / (this.length_1+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}); circleObject = sim.addCircle({x:465/2/30, y:(465/2 + (this.length_1 + this.length_2)*line_ratio)/30, radius:6/30, density:mass_2}); sim.addJoint({type:"distance", a:circleA.body, b:circleB.body}); sim.addJoint({type:"distance", a:circleB.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); } /* * Calculates 2D cubic Catmull-Rom spline. * @see http://www.mvps.org/directx/articles/catmull/ */ 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)))) ); } } } Code Fullscreen Preview Fullscreen gaziya arkcocco bradsedito andrewexex88.. type Point shift TimerEvent.ENTER_FRAME start length addEventListener push addChild Array Sprite int Number sort new page view favorite forked pv3801 Sound of Double Pendulum naraba forked:3 favorite:24lines:117 (diff:55) tag: SiON awesome beautifl box2d pendulum physics sound pv74 forked from: Double Pendulum i.. TheDailySpank forked:0 favorite:0lines:77 (diff:2) pv122 forked from: Double Pendulum i.. TheDailySpank forked:0 favorite:1lines:77 (diff:4) pv0 forked from: Double Pendulum i.. TheDailySpank forked:0 favorite:0lines:77 (diff:1) pv2303 Triple Pendulum in QuickBox2D makc3d forked:3 favorite:21lines:80 (diff:11) tag: alpha box2d draw pendulum phisics quickbox2d