资源描述:
《Nurbs中文资料》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、应一些网友的要求,drew在这里提供以前在学校写的非均匀有理B样条(NURBS)曲线曲面造型的主要算法函数源码,供感兴趣的朋友参考。由于这是多年前在学校所做的程序,为方便编程,坐标数据主要采用三维数组形式。当时使用计算机内存很小(好像是4M内存),所以所取控制点数有一定的限制(15个),其它未列的函数是一些数据结构,内存分配和空间转换的函数,和算法无关,可以不必考虑。由于这些源码函数是从drew的论文程序中摘录出来的,所以需要做一些修改才能使用,朋友们可以参考和修改这些算法函数,加入自己的程序。关于NURBS,曲
2、线曲面造型算法最好的中文资料,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];i
3、ntcounti,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]
4、)* (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]
5、)* (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(
6、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++)
7、 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
8、][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+