产生三次方贝塞尔曲线的程序码
*/
typedef struct
{
float x
float y
}
Point2D
/*
cp 在此是四个元素的阵列:
cp[0] 为起始点,或上图中的 P0
cp[1] 为第一个控制点,或上图中的 P1
cp[2] 为第二个控制点,或上图中的 P2
cp[3] 为结束点,或上图中的 P3
t 为参数值,0 <= t <= 1
*/
Point2D PointOnCubicBezier( Point2D* cp, float t )
{
float ax, bx, cx
float ay, by, cy
float tSquared, tCubed
Point2D result
/* 计算多项式系数 */
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
}
/*
ComputeBezier 以控制点 cp 所产生的曲线点,填入 Point2D 结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为 <sizeof(Point2D) numberOfPoints>
*/
void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )
{
float dt
int i
dt = 1.0 / ( numberOfPoints - 1 )
for( i = 0i <numberOfPointsi++)
curve[i] = PointOnCubicBezier( cp, i*dt )
}
三个点:void Berzier(double * x,double *y,double *TempX ,double *TempY,int n,int linesize)
{
int i
double *CP[2]
CP[0]=NULLCP[1]=NULL
for(i=0i<2i++)while(CP[i]==NULL)CP[i]=new double [n]
double t=0
double dt=(double)1/linesize
int j=0
for(t=0j<(linesize+1)j++,t+=dt)
{
for(i=0i<ni++)
{
CP[0][i]=x[i]
CP[1][i]=y[i]
}
for(i=1i<ni++)
for(int m=0m<n-im++)
{
CP[0][m]=CP[0][m]+t*(CP[0][m+1]-CP[0][m])
CP[1][m]=CP[1][m]+t*(CP[1][m+1]-CP[1][m])
}
TempX[j]=CP[0][0]
TempY[j]=CP[1][0]
}
delete CP[0]delete CP[1]
return
}
x,y是输入瓣二维数据的坐标,n是点数,如果是二次,n应该等于3,,linesize是插值得到曲线出点数,对应坐标保存在TempX ,TempY
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)