//根据基点信息计算二次和三次Bezier曲线的点序列
import flash.geom.Point;
class Bezier
{
var p1:Point;
var p2:Point;
var p3:Point;
var p4:Point;
var tp1:Point;
var tp2:Point;
var tp3:Point;
var tp4:Point;
var count:Number;
//init Bezier data
function Bezier(pt1:Point,pt2:Point,pt3:Point,pt4:Point)
{
if(arguments.length < 3)
return;
if(arguments.length == 3){
count = 3;
}
else
{
count = 4;
}
p1 = pt1;
p2 = pt2;
p3 = pt3;
p4 = pt4;
}
// calculate point
function calculate(t:Number)
{
var temp:Point;
//(1-t)*(1-t)*p1+2*t*(1-t)*p2+t*t*p3
//Math.pow(1-t,3)*p1+3*t*(1-t)*(1-t)*p2+3*t*t*(1-t)*p3+Math.pow(t,3)*p4
//二次Bezier
if(count == 3)
{
tp1 = multiply((1-t)*(1-t),p1);
tp2 = multiply(2*t*(1-t),p2);
tp3 = multiply(t*t,p3);
temp = p1.add(tp2);
temp = temp.add(tp3);
}
else
//三次Bezier
{
tp1 = multiply(Math.pow(1-t,3),p1);
tp2 = multiply(3*t*(1-t)*(1-t),p2);
tp3 = multiply(3*t*t*(1-t),p3);
tp4 = multiply(Math.pow(t,3),p4);
temp = tp1.add(tp2);
temp = temp.add(tp3);
temp = temp.add(tp4);
}
return temp;
}
function multiply(num:Number,p:Point):Point
{
var temp:Point = new Point();
temp.x = p.x*num;
temp.y = p.y*num;
return temp;
}
}
//------
使用方法:
//根据构造函数的参数来确定二次还是三次的Bezier,第一和最后一个参数是基本点,中间的是控制点...
//50,400,140,20,400,40,635,420
import flash.geom.Point;
var m1 = new Point(50,400);
var m2 = new Point(140,20);
var m3 = new Point(400,40);
var m4 = new Point(635,420);
var b = new Bezier(m1,m2,m3,m4);
for(var i=0;i<=100;i++)
{
trace(b.calculate(i/100));
}
//------
//trace结果
(x=50, y=400)
(x=52.750805, y=388.71996)
(x=55.60244, y=377.67968)
(x=58.553735, y=366.87892)
(x=61.60352, y=356.31744)
(x=64.750625, y=345.995)
(x=67.99388, y=335.91136)
(x=71.332115, y=326.06628)
(x=74.76416, y=316.45952)
(x=78.288845, y=307.09084)
(x=81.905, y=297.96)
(x=85.611455, y=289.06676)
(x=89.40704, y=280.41088)
(x=93.290585, y=271.99212)
(x=97.26092, y=263.81024)
(x=101.316875, y=255.865)
(x=105.45728, y=248.15616)
(x=109.680965, y=240.68348)
(x=113.98676, y=233.44672)
(x=118.373495, y=226.44564)
(x=122.84, y=219.68)
(x=127.385105, y=213.14956)
(x=132.00764, y=206.85408)
(x=136.706435, y=200.79332)
(x=141.48032, y=194.96704)
(x=146.328125, y=189.375)
(x=151.24868, y=184.01696)
(x=156.240815, y=178.89268)
(x=161.30336, y=174.00192)
(x=166.435145, y=169.34444)
(x=171.635, y=164.92)
(x=176.901755, y=160.72836)
(x=182.23424, y=156.76928)
(x=187.631285, y=153.04252)
(x=193.09172, y=149.54784)
(x=198.614375, y=146.285)
(x=204.19808, y=143.25376)
(x=209.841665, y=140.45388)
(x=215.54396, y=137.88512)
(x=221.303795, y=135.54724)
(x=227.12, y=133.44)
(x=232.991405, y=131.56316)
(x=238.91684, y=129.91648)
(x=244.895135, y=128.49972)
(x=250.92512, y=127.31264)
(x=257.005625, y=126.355)
(x=263.13548, y=125.62656)
(x=269.313515, y=125.12708)
(x=275.53856, y=124.85632)
(x=281.809445, y=124.81404)
(x=288.125, y=125)
(x=294.484055, y=125.41396)
(x=300.88544, y=126.05568)
(x=307.327985, y=126.92492)
(x=313.81052, y=128.02144)
(x=320.331875, y=129.345)
(x=326.89088, y=130.89536)
(x=333.486365, y=132.67228)
(x=340.11716, y=134.67552)
(x=346.782095, y=136.90484)
(x=353.48, y=139.36)
(x=360.209705, y=142.04076)
(x=366.97004, y=144.94688)
(x=373.759835, y=148.07812)
(x=380.57792, y=151.43424)
(x=387.423125, y=155.015)
(x=394.29428, y=158.82016)
(x=401.190215, y=162.84948)
(x=408.10976, y=167.10272)
(x=415.051745, y=171.57964)
(x=422.015, y=176.28)
(x=428.998355, y=181.20356)
(x=436.00064, y=186.35008)
(x=443.020685, y=191.71932)
(x=450.05732, y=197.31104)
(x=457.109375, y=203.125)
(x=464.17568, y=209.16096)
(x=471.255065, y=215.41868)
(x=478.34636, y=221.89792)
(x=485.448395, y=228.59844)
(x=492.56, y=235.52)
(x=499.680005, y=242.66236)
(x=506.80724, y=250.02528)
(x=513.940535, y=257.60852)
(x=521.07872, y=265.41184)
(x=528.220625, y=273.435)
(x=535.36508, y=281.67776)
(x=542.510915, y=290.13988)
(x=549.65696, y=298.82112)
(x=556.802045, y=307.72124)
(x=563.945, y=316.84)
(x=571.084655, y=326.17716)
(x=578.21984, y=335.73248)
(x=585.349385, y=345.50572)
(x=592.47212, y=355.49664)
(x=599.586875, y=365.705)
(x=606.69248, y=376.13056)
(x=613.787765, y=386.77308)
(x=620.87156, y=397.63232)
(x=627.942695, y=408.70804)
(x=635, y=420)