预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共24页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

应一些网友的要求,drew在这里提供以前在学校写的非均匀有理B样条(NURBS)曲线曲面造型的主要算法函数源码,供感兴趣的朋友参考。 由于这是多年前在学校所做的程序,为方便编程,坐标数据主要采用三维数组形式。当时使用计算机内存很小(好像是4M内存),所以所取控制点数有一定的限制(15个),其它未列的函数是一些数据结构,内存分配和空间转换的函数,和算法无关,可以不必考虑。由于这些源码函数是从drew的论文程序中摘录出来的,所以需要做一些修改才能使用,朋友们可以参考和修改这些算法函数,加入自己的程序。 关于NURBS,曲线曲面造型算法最好的中文资料,drew推荐北航施法中教授编写的《计算机辅助几何设计与非均匀有理B样条(CAGD&NURBS)》. //哈特利(Hartley)-贾德(Judd,1978)的弦长参数化算法求节点矢量U,用于由控制点正算曲线曲面 //coeff:控制顶点。//v1,v2:U向,W向的节点序列。count,countj:控制点行数和列数。 voidHartley_Judd(coeff,v1,v2,counti,countj)floatcoeff[15][15][3];floatv1[20],v2[20];intcounti,countj;{inti,s,j,k=DEGREE_J,n1=counti-1,n2=countj-1;floatl1[20],l2[20];floatll01,ll11,ll02,ll12;for(i=1;i<=n1;i++)l1[i]=(float)sqrt((coeff[i][0][0]-coeff[i-1][0][0])*(coeff[i][0][0]-coeff[i-1][0][0])+(coeff[i][0][1]-coeff[i-1][0][1])*(coeff[i][0][1]-coeff[i-1][0][1])+(coeff[i][0][2]-coeff[i-1][0][2])*(coeff[i][0][2]-coeff[i-1][0][2]));for(i=1;i<=n2;i++)l2[i]=(float)sqrt((coeff[0][i][0]-coeff[0][i-1][0])*(coeff[0][i][0]-coeff[0][i-1][0])+(coeff[0][i][1]-coeff[0][i-1][1])*(coeff[0][i][1]-coeff[0][i-1][1])+(coeff[0][i][2]-coeff[0][i-1][2])*(coeff[0][i][2]-coeff[0][i-1][2]));ll01=0;ll11=0;for(i=0;i<=k;i++)v1[i]=0;for(i=k+1;i<=n1+1;i++){for(j=i-k;j<=i-1;j++)ll01=ll01+l1[j];for(s=k+1;s<=n1+1;s++)for(j=s-k;j<=s-1;j++)ll11=ll11+l1[j];v1[i]=ll01/ll11+v1[i-1];}for(i=n1+1;i<=n1+k+1;i++)v1[i]=1;if(v1[2]==1)v1[2]=0;ll02=0;ll12=0;for(i=0;i<=k;i++)v2[i]=0;for(i=k+1;i<=n2+1;i++){for(j=i-k;j<=i-1;j++)ll02=ll02+l2[j];for(s=k+1;s<=n2+1;s++)for(j=s-k;j<=s-1;j++)ll12=ll12+l2[j];v2[i]=ll02/ll12+v2[i-1];}for(i=n2+1;i<=n2+k+1;i++)v2[i]=1;if(v2[2]==1)v2[2]=0;} //伯姆(Boehm)节点插入算法://coeff:原控制顶点.v:原节点序列.uu:新插入节点.counti:原控制点数.d:新控制顶点 voidboehm(coeff,v,uu,counti,d)floatcoeff[15][3],v[20],d[15][3],uu;intcounti;{intr=0,g=0,i,j;floata[15],vd[20];for(i=0;i<=counti+DEGREE_J;i++){if(uu==v[i])r++;elseif(uu>=v[i])g++;}g--;for(i=0;i<=g-DEGREE_J;i++)for(j=0;j<=2;j++)d[i][j]=coeff[i][j];for(i=g-DEGREE_J+1;i<=g-r;i++)for(j=0;j<=2;j++){a[i]=(float)((uu-v[i])/(v[i+DEGREE_J]-v[i]));d[i][j]