急找绘制bezier曲面代码(matlab)

急找绘制bezier曲面代码(matlab),第1张

/*

产生三次方贝塞尔曲线的程序码

*/

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11646849.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存