资源描述:
《B样条曲线面和NURBS曲线曲面C语言算法源程序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、学习小结:前面学习了Bezier曲线,B样条基函数和B样条曲线的一些基础知识。掌握关键问题是一条B样条曲线间的多段曲线的光滑连接。因为现在是用多段Bezier曲线来描绘一条B样条曲线,所以问题变为两段Bezier曲线间光滑连接。两段Bezier曲线段(3次)B1和B2光滑连接的条件:(1).要求B1和B2有共同的连接点,即G0连续。(2).要求B1和B2在连接点处有成比例的一阶导数,即G1连续。由端点处的一阶导数,为实现G1连续,则有:即:这也表明,三点共线。如下图表示了一条3次B样条曲线的所有控制多边形:(P1)P2P3P4(P11)(P12)P5P10
2、P0P6P9P7P8图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"glgl.h"#include"math.h"//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*B样条基函数计算部分*-*-*-*-*-*-*-*-*-*-*-*-*-*//确定参数u所在的节点区间下标//
3、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
4、
5、u>U[mid]){if(u=U[mid]&&u
6、的下标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
7、0]=0;dp+=1;for(j=1;j8、------------------------//计算基函数的1阶导数并保存在NP[]中//i为参数u所在的节点区间下标//p为B样条函数次数P>2voidDerBasisFunc(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
9、1;elsetmpN[di][0]=0;dp+=1;for(j=1;j10、*tmpN[di+1][j-1])/(p+p-1);}}NP[i-