In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: BasicHermite

@author george
/**
 * Copyright synapticwave ( http://wonderfl.net/user/synapticwave )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/xp7Y
 */

// forked from George.Profenza's BasicHermite
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;

    /**
     * @author george
     */
    public class BezierCurve extends Sprite {
        private var percent:Number = 0;
        private var P0:Point = new Point(10,490);//1st control pt
        private var T0:Point = new Point(300,200);//1st anchor pt - NOTE! The anchors are relative to the controls
        private var P1:Point = new Point(200,90);//2nd control pt
        private var T1:Point = new Point(400,100);//2nd control pt
        private var points:Array = [P0,T0,P1,T1];
          
        private var P2:Point = new Point(200,90);
        private var T2:Point = new Point(400, 100);
        private var P3:Point = new Point(390,20);
        private var T3:Point = new Point(100,200);
        private var points2:Array = [P2, T2, P3, T3];
        private var pointAtPercent:Point;
        
        public function BezierCurve() {
            init();
        }
        private function init():void{
            stage.doubleClickEnabled = true;
            stage.addEventListener(MouseEvent.DOUBLE_CLICK, reset);
            reset();
        }
        private function reset(event : MouseEvent = null) : void {
           // P1.x = 200 + Math.random() * 200;//randomize a wee bit
          //  T1.x = Math.random() * 200 - 100;
            graphics.clear();
            percent = 0;
            this.addEventListener(Event.ENTER_FRAME, draw);
            
        }
        private function draw(event : Event) : void {
            
   
            
            pointAtPercent = hermite(percent, points);//compute point
            if(percent == 0) graphics.moveTo(pointAtPercent.x,pointAtPercent.y);//draw
            graphics.lineStyle(5,0x009900,percent);
            graphics.lineTo(pointAtPercent.x,pointAtPercent.y);
            percent += .015;//update percentage of traversal along curve
            if(percent >= 1) 
            {
                percent = 0;
                removeEventListener(Event.ENTER_FRAME, draw);//doENTER_FRAME
                this.addEventListener(Event.ENTER_FRAME, draw2);
            }
        }
        private function draw2(event :Event) : void {
            pointAtPercent = hermite(percent, points2);
            if (percent == 0) graphics.moveTo(pointAtPercent.x, pointAtPercent.y);
            graphics.lineStyle(5, 0x990000,percent);
            graphics.lineTo(pointAtPercent.x, pointAtPercent.y);
            percent += .015;
            if (percent >=1) removeEventListener(Event.ENTER_FRAME, draw2);
        }
        /*
         * Computes x,y values for a given traversal of a Hermite Curve
         * @param t:Number - a normalized value (0.0 to 1.0) describing path traversal
         * @param points:Array - an array contining the 4 points describing the curve (P0,T0,P1,T1 - always in this order)
         * Anchor points are relative to they're control points
         */
        private function hermite(t:Number,points:Array):Point{
            var result:Point = new Point();
            result.x = (2 * Math.pow(t,3) - 3 * t * t + 1) * points[0].x+
                        (Math.pow(t,3) - 2 * t * t + t) * points[1].x + 
                        (- 2 * Math.pow(t,3) + 3*t*t) * points[2].x +
                        ( Math.pow(t,3) - t*t) * points[3].x;
            result.y = (2 * Math.pow(t,3) - 3 * t * t + 1) * points[0].y+
                        (Math.pow(t,3) - 2 * t * t + t) * points[1].y + 
                        (- 2 * Math.pow(t,3) + 3*t*t) * points[2].y +
                        ( Math.pow(t,3) - t*t) * points[3].y;
            return result;
        }
    }
}