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

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

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

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

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

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

学习小结:前面学习了Bezier曲线,B样条基函数和B样条曲线的一些基础知识。掌握关键问题是一条B样条曲线间的多段曲线的光滑连接。因为现在是用多段Bezier曲线来描绘一条B样条曲线,所以问题变为两段Bezier曲线间光滑连接。两段Bezier曲线段(3次)B1和B2光滑连接的条件: (1).要求B1和B2有共同的连接点,即G0连续。 (2).要求B1和B2在连接点处有成比例的一阶导数,即G1连续。由端点处的一阶导数,为实现G1连续,则有: 即: 这也表明,三点共线。如下图表示了一条3次B样条曲线的所有控制多边形: (P1)P2 P3 P4(P11)(P12) P5P10 P0P6P9 P7P8 图5.3次B样条曲线和所有控制多边形 图5中,P0至P6为原始3次B样条曲线控制多边形顶点,P0至P12是计算后最终形成B样条曲线控制多边形顶点。 图6.双二次(2x2)B样条曲面 6.B样条曲线曲面和NURBS曲线曲面的C语言实现算法源程序 #ifndef_mynurbs_h #ifndef_MYNURBS_H #include"gl\gl.h" #include"math.h" //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*B样条基函数计算部分*-*-*-*-*-*-*-*-*-*-*-*-*-* //确定参数u所在的节点区间下标 //n=m-p-1 //m为节点矢量U[]的最大下标 //p为B样条函数次数 intFindSource(intn,intp,floatu,floatU[]) { intlow,high,mid; if(u==U[n+1])//特殊情况 returnn; //进行二分搜索 low=p; high=n+1; mid=(int)(low+high)/2; while(u<U[mid]||u>U[mid]) { if(u<U[mid]) high=mid; else low=mid; mid=(int)(low+high)/2; if(u>=U[mid]&&u<U[mid+1])//找到u所在的节点区间的下标 break;//退出二分搜索 } returnmid;//返回区间下标 } //计算所有非零B样条基函数并返回其值 //i为参数u所在的节点区间下标 voidBasisFunction(inti,intp,floatu,floatU[],floatN[]) { intj,di,dp,k; floattul,tur,left,right; floattmpN[50][50]; for(k=0;k<=p;k++) { dp=0; for(di=i+p-k;di>=i-k;di--) { if(u>=U[di]&&u<U[di+1]) tmpN[di][0]=1; else tmpN[di][0]=0; dp+=1; for(j=1;j<dp;j++) { tul=U[di+j]-U[di]; tur=U[di+j+1]-U[di+1]; if(tul!=0) left=(u-U[di])/tul; else left=0; if(tur!=0) right=(U[di+j+1]-u)/tur; else right=0; tmpN[di][j]=left*tmpN[di][j-1]+right*tmpN[di+1][j-1]; } } N[i-k]=tmpN[i-k][p]; } } //----------------------------------------------------------------------- //计算基函数的1阶导数并保存在NP[]中 //i为参数u所在的节点区间下标 //p为B样条函数次数P>2 voidDerBasisFunc(inti,intp,floatu,floatU[],floatNP[]) { intj,di,dp,k; floattul,tur,left,right,saved,dl,dr; floattmpN[50][50]; for(k=0;k<=p;k++) { dp=0; for(di=i+p-k;di>=i-k;di--) { if(u>=U[di]&&u<U[di+1]) tmpN[di][0]=1; else tmpN[di][0]=0; dp+=1; for(j=1;j<dp;j++) { tul=U[di+j]-U[di]; tur=U[di+j+1]-U[di+1]; if(tul!