/******************************** * 项 目:Bezier * 包 名: * 文件名:Bezier.as * 功 能: * 创建者:rui * 修改者: * 修改目的: * 创建日期:2011-11-82010-11-15 ********************************/ package { import flash.display.*; import flash.geom.Point; public class Bezi extends Sprite { public function Bezi() { } /** * 在贝尔曲线上的点 * @param cp 对应的四个控制点 * @param t t為參數值,0 <= t <= 1 * @return * */ private static function pointOnCubicBezier(cp:Vector., t:Number ):Point { var ax:Number, bx:Number, cx:Number; var ay:Number, by:Number, cy:Number; var tSquared:Number, tCubed:Number; var result:Point = new Point();; // 计算对应的多项式系数点 cx = 3.0 * (cp[1].x - cp[0].x); bx = 3.0 * (cp[2].x - cp[1].x) - cx; ax = cp[3].x - cp[0].x - cx - bx; cy = 3.0 * (cp[1].y - cp[0].y); by = 3.0 * (cp[2].y - cp[1].y) - cy; ay = cp[3].y - cp[0].y - cy - by; //对应参数t 对应的曲线点 tSquared = t * t; tCubed = tSquared * t; result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x; result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y; return result; } /** * 生成 贝尔曲线的对应 point * @param cp 生成曲线的对应的四个贝尔曲线控制点 * @param pointSize 要生成多少个点 * @return * */ public static function computeBezier(cp:Vector.,pointSize:int=10):Vector. { var dt:Number; var i:int; var curve:Vector. = new Vector.(); dt = 1.0 /(pointSize-1); for( i = 0; i < pointSize; i++) { curve.push(pointOnCubicBezier(cp,dt*Number(i))); } return curve; } } }