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;
}
}
}