Catmull-Rom Error CLICK and drag red dots to change the shape shapevent forked:5favorite:13lines:84license : MIT License modified : 2010-03-22 22:25:07 Embed Tweet package { // CLICK and drag red dots to change the shape import flash.display.*; import flash.events.*; import flash.geom.*; [SWF(width = 500, height= 500)] public class CatmullError extends MovieClip { private var pnts:Array; public function CatmullError(){ // init pnts = new Array(); // make 8 control points for (var i:int = 0; i<8; i++){ pnts.push(dot(50 + Math.random() * 80 * i, Math.random()*(stage.stageHeight-40)+20)); } addEventListener(Event.ENTER_FRAME, onLoop); // all math from http://en.wikipedia.org/wiki/Cubic_Hermite_spline // draggable dot stage.addEventListener(MouseEvent.MOUSE_UP, onUp); stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown); } // private methods private function onLoop(evt:Event):void { graphics.clear(); graphics.lineStyle(0,0); curve(pnts); } private function tangent(pk1:Sprite, pk_1:Sprite):Point{ return new Point((pk1.x - pk_1.x) / 2, (pk1.y - pk_1.y) / 2); } private function curve(p:Array, res:Number=.05):void{ var px:Number = 0; var py:Number = 0; var pIter:int = p.length - 1; var m:Array = []; m[0] = tangent(p[1], p[0]); for (var i:int = 1; i<pIter; i++){ m[i] = tangent(p[i + 1], p[i - 1]); } m[pIter] = tangent(p[pIter], p[pIter - 1]); for (var t:Number = 0; t <1; t+=res){ var t_2:Number = t * t; var _1_t:Number = 1 - t; var _2t:Number = 2 * t; var h00:Number = (1 + _2t) * (_1_t) * (_1_t); var h10:Number = t * (_1_t) * (_1_t); var h01:Number = t_2 * (3 - _2t); var h11:Number = t_2 * (t - 1); for (var k:int = 0; k <pIter; k++){ var k1:int = k + 1; var pk:Sprite = p[k]; var pk1:Sprite = p[k1]; var mk:Point = m[k]; var mk1:Point = m[k1]; px = h00 * pk.x + h10 * mk.x + h01 * pk1.x + h11 * mk1.x; py = h00 * pk.y + h10 * mk.y + h01 * pk1.y + h11 * mk1.y; if (k == 0){ graphics.moveTo(px, py); }else{ graphics.lineTo(px, py); } // canvas.setPixel(px, py, 0xFFFFFF); } } } private function dot(xp:Number, yp:Number, col:uint = 0xFF0000, rad:Number=4):Sprite { var s:Sprite = Sprite(addChild(new Sprite)); s.x = xp; s.y = yp; with(s.graphics) beginFill(col), drawCircle(0,0,rad); s.buttonMode = true; s.addEventListener(MouseEvent.MOUSE_DOWN, onDrag); return s; } private function onDrag(evt:MouseEvent):void { evt.currentTarget.startDrag() } private function onDown(evt:MouseEvent):void{ dotsVisible(false); } private function onUp(evt:MouseEvent):void{ stopDrag(); dotsVisible(true); } private function dotsVisible(bool:Boolean):void{ for (var i:int = 0; i<pnts.length; i++){ pnts[i].visible = bool; } } } } Code Fullscreen Preview Fullscreen arkcocco tjoen bgarraud tkinjo tmn nki2 Kay paq xor SnakeGp bradsedito : mesh baby novita001 : Catmull-Rom koszetrawnik.. : curve_ Catmull-Rom Spline, graphics, math stopDrag startDrag MouseEvent.MOUSE_DOWN MouseEvent visible buttonMode graphics clear Point drawCircle MouseEvent.MOUSE_UP addEventListener beginFill MovieClip moveTo lineTo lineStyle push stageHeight Array sort new page view favorite forked pv0 forked from: Catmull-Rom Error.. arkcocco forked:0 favorite:0lines:84 (diff:1) pv0 forked from: Catmull-Rom Error.. arkcocco forked:0 favorite:0lines:84 (diff:1) pv158 forked from: Catmull-Rom Error.. hacker_7ul1zjpa forked:0 favorite:0lines:84 (diff:3) pv0 forked from: Catmull-Rom Error.. hacker_7ul1zjpa forked:0 favorite:0lines:84 (diff:1) pv1392 forked from: Catmull-Rom Error.. Altschuler forked:4 favorite:2lines:93 (diff:12)