/*
产生三次方贝塞尔曲线的程序码
*/
typedefstruct
{
floatx;
floaty;
}
Point2D;
/*
cp在此是四个元素的阵列:
cp[0]为起始点,或上图中的P0
cp[1]为第一个控制点,或上图中的P1
cp[2]为第二个控制点,或上图中的P2
cp[3]为结束点,或上图中的P3
t为参数值,0=t=1
*/
Point2DPointOnCubicBezier(Point2D*cp,floatt)
{
floatax,bx,cx;
floatay,by,cy;
floattSquared,tCubed;
Point2Dresult;
/*计算多项式系数*/
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;
returnresult;
}
/*
ComputeBezier以控制点cp所产生的曲线点,填入Point2D结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为sizeof(Point2D)numberOfPoints
*/
voidComputeBezier(Point2D*cp,intnumberOfPoints,Point2D*curve)
{
floatdt;
inti;
dt=1.0/(numberOfPoints-1);
for(i=0;inumberOfPoints;i)
curve=PointOnCubicBezier(cp,i*dt);
} |