package { import hype.framework.behavior.AbstractBehavior; import hype.framework.behavior.IBehavior; import flash.geom.Point; import flash.display.Shape; import flash.display.Graphics; import flash.display.MovieClip; public class Bezier extends AbstractBehavior implements IBehavior { protected var _startP:Point; protected var _endP:Point; protected var _h1:Point; protected var _h2:Point; protected var _steps:Number; protected var _index:Number; public function Bezier(target:Object, startP:Point, endP:Point, h1:Point, h2:Point, steps:Number = 50, index:Number = 1) { super(target); _startP = startP; _endP = endP; _h1 = h1; _h2 = h2; _steps = steps; _index = index; } public function showHandles():MovieClip { var child:Shape = new Shape(); //add handles child.graphics.beginFill(0xff0000); child.graphics.drawCircle(_h1.x, _h1.y, 5); child.graphics.drawCircle(_h2.x, _h2.y, 5); child.graphics.endFill(); //start and end child.graphics.beginFill(0x00ff00); child.graphics.drawCircle(_startP.x, _startP.y, 5); child.graphics.drawCircle(_endP.x, _endP.y, 5); child.graphics.endFill(); //add handle lines child.graphics.lineStyle(1, 0x000000); child.graphics.moveTo(_startP.x, _startP.y); child.graphics.lineTo(_h1.x, _h1.y); child.graphics.moveTo(_endP.x, _endP.y); child.graphics.lineTo(_h2.x, _h2.y); child.graphics.lineStyle(1, 0xffff00); child.graphics.moveTo(_startP.x, _startP.y); for (var i:Number = 0; i < _steps; ++i) { var t:Number = i / _steps; var a:Number = Math.pow(1.0 - t, 3); var b:Number = 3.0 * t * Math.pow(1.0 - t, 2); var c:Number = 3.0 * Math.pow(t, 2) * (1.0 - t); var d:Number = Math.pow(t, 3); var myX:Number = a * _startP.x + b * _h1.x + c * _h2.x + d * _endP.x; var myY:Number = a * _startP.y + b * _h1.y + c * _h2.y + d * _endP.y; child.graphics.lineTo(myX, myY); } var mc:MovieClip = new MovieClip(); mc.addChild(child); return mc; } public function run(target:Object):void { if (_index <= _steps) { var t:Number = _index / _steps; var a:Number = Math.pow(1.0 - t, 3); var b:Number = 3.0 * t * Math.pow(1.0 - t, 2); var c:Number = 3.0 * Math.pow(t, 2) * (1.0 - t); var d:Number = Math.pow(t, 3); var myX:Number = a * _startP.x + b * _h1.x + c * _h2.x + d * _endP.x; var myY:Number = a * _startP.y + b * _h1.y + c * _h2.y + d * _endP.y; setProperty('x', myX); setProperty('y', myY); _index ++; } else { _index = 1; } } } }