c语言编程b样条曲线,B样条曲线曲面和NURBS曲线曲面C语言算法源程序

《B样条曲线曲面和NURBS曲线曲面C语言算法源程序》由会员分享,可在线阅读,更多相关《B样条曲线曲面和NURBS曲线曲面C语言算法源程序(27页珍藏版)》请在人人文库网上搜索。

1、学习小结:前面学习了Bezier曲线,B样条基函数和B样条曲线的一些基础知识。掌握关键问题是一条B样条曲线间的多段曲线的光滑连接。因为现在是用多段Bezier曲线来描绘一条B样条曲线,所以问题变为两段Bezier曲线间光滑连接。两段Bezier曲线段(3次)B1和B2光滑连接的条件:(1).要求B1和B2有共同的连接点,即G0连续。(2).要求B1和B2在连接点处有成比例的一阶导数,即G1连续。由端点处的一阶导数,为实现G1连续,则有:即: 这也表明,三点共线。如下图表示了一条3次B样条曲线的所有控制多边形:(P1) P2 P3P4 (P11) (P12)P5 P10P0 P6 P9P7 P8。

2、 图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所在的节点区间下标/n=m-p-1 /m为节点矢量U的最大下标/p为B样条函数。

3、次数int FindSource(int n,int p,float u,float U)int low,high,mid;if(u=Un+1)/特殊情况return n;/进行二分搜索low=p;high=n+1;mid=(int)(low+high)/2;while(uUmid)if(u=Umid&u=i-k;di-)if(u=Udi&u2void DerBasisFunc(int i,int p,float u,float U,float NP)int j,di,dp,k;float tul,tur,left,right,saved,dl,dr;float tmpN5050;for(k=。

4、0;k=i-k;di-)if(u=Udi&u0&i=i-p;j-)tmp+=Nj*Pj;Deri-p=tmp;/计算曲线上的点(u所对应的所有点)保存在Poi中/n=m-p-1/p为曲线的次数void BSplinePoint(int n,int p,float U,float P,float Poi)float N100,tmp;int i,j;for(i=p+1;i=i-p;j-)tmp+=Nj*Pj;Poii-p=tmp;/计算3次样条曲线上的所有控制多边形保存在CP中/m为节点矢量U的最大下标void B3SplineControlPoint(int m,float U,float P。

5、,float CP)int n,k,i,cp,p;float Poi100,Der100,add;p=3;n=m-p-1;BSplinePoint(n,p,U,P,Poi);BSplineDer(n,p,U,P,Der);cp=(n-p)*3+p;for(i=0;i=i-p;j-)tmp+=Nj*Pj*Wj;tmw+=Nj*Wj;Poii-p=tmp/tmw;/计算Nurbs曲线的1阶导矢(u所对应的所有点)保存在Der中/n=m-p-1/p为曲线的次数void NurbsDer(int n,int p,float U,float P,float W,float Der)float N100,。

6、CP100,NW100,tmp,tw;int i,j;NurbsPoint(n,p,U,P,W,CP);BSplinePoint(n,p,U,W,NW);for(i=p+1;i=i-p;j-)tmp+=Nj*Pj*Wj;tw+=Nj*Wj;Deri-p=(tmp-tw*CPi-p)/NWi-p;/计算3次Nurbs曲线上的所有控制多边形保存在CP中/m为节点矢量U的最大下标void Nurbs3ControlPoint(int m,float U,float P,float W,float CP)int n,k,i,cp,p;float Poi100,Der100,add;p=3;n=m-p-。

7、1;NurbsPoint(n,p,U,P,W,Poi);NurbsDer(n,p,U,P,W,Der);cp=(n-p)*3+p;for(i=0;i2;i+)CPi=Pi;CPcp-i=Pn-i;for(i=3;icp-1;i+=3) k=(int)i/3;add=Derk/p;CPi=Poik;CPi-1=CPi-add;CPi+1=CPi+add;/计算2次Nurbs曲线上的所有控制多边形保存在CP中/m为节点矢量U的最大下标void Nurbs2ControlPoint(int m,float U,float P,float W,float CP)int n,k,tm,i,cp,p;fl。

8、oat Poi100;p=2;n=m-p-1;NurbsPoint(n,p,U,P,W,Poi);cp=(n-p)*2+p;for(i=0;i2;i+)CPi=Pi;CPcp=Pn;tm=2;for(i=2;icp-1;i+=2) k=(int)i/2;CPi=Poik;CPi+1=Ptm;tm+;/绘制3次Nurbs样条曲线/m为节点矢量U的最大下标void Nurbs3L(int m,float U,float px,float py,float pz,float W)float pcx100,pcy100,pcz100,drx4,dry4,drz4;float pcw100,drw4;i。

9、nt i,j,tmcp;Nurbs3ControlPoint(m,U,px,W,pcx);Nurbs3ControlPoint(m,U,py,W,pcy);Nurbs3ControlPoint(m,U,pz,W,pcz);B3SplineControlPoint(m,U,W,pcw);tmcp=m-7;for(i=0;i=tmcp;i+)for(j=i*3;ji*3+4;j+)drxj-i*3=pcxj;dryj-i*3=pcyj;drzj-i*3=pczj;drwj-i*3=pcwj;NBezier(3,drx,dry,drz,drw,20);/绘制2次Nurbs样条曲线/m为节点矢量U的最。

10、大下标void Nurbs2L(int m,float U,float px,float py,float pz,float W)float pcx100,pcy100,pcz100,drx3,dry3,drz3;float pcw100,drw3;int i,j,tmcp;Nurbs2ControlPoint(m,U,px,W,pcx);Nurbs2ControlPoint(m,U,py,W,pcy);Nurbs2ControlPoint(m,U,pz,W,pcz);B2SplineControlPoint(m,U,W,pcw);tmcp=m-5;for(i=0;i=tmcp;i+)for(。

11、j=i*2;ji*2+3;j+)drxj-i*2=pcxj;dryj-i*2=pcyj;drzj-i*2=pczj;drwj-i*2=pcwj;NBezier(2,drx,dry,drz,drw,20);/计算双三次(3x3)Nurbs样条曲面所有控制多边形顶点,并保存在pt中/mu,mv分别为节点矢量U,V的最大下标值void Nurbs3FControlPoint(int mu,float U,int mv,float V,float px,float py,float pz,float W,float pt1001004)int i,j,k,dp;float tmx50,tmy50,tm。

12、z50,tmw50;float tmpx50100,tmpy50100,tmpz50100,tmpw50100;float uvx100100,uvy100100,uvz100100,uvw100100;for(i=0;imv-3;i+)dp=i*(mu-3);for(j=dp;jmu-3+dp;j+)tmxj-dp=pxj;tmyj-dp=pyj;tmzj-dp=pzj;tmwj-dp=Wj;Nurbs3ControlPoint(mu,U,tmx,tmw,tmpxi);Nurbs3ControlPoint(mu,U,tmy,tmw,tmpyi);Nurbs3ControlPoint(mu,U。

13、,tmz,tmw,tmpzi);B3SplineControlPoint(mu,U,tmw,tmpwi);for(i=0;i3*mu-17;i+)for(j=0;jmv-3;j+)tmxj=tmpxji;tmyj=tmpyji;tmzj=tmpzji;tmwj=tmpwji;Nurbs3ControlPoint(mv,V,tmx,tmw,uvxi);Nurbs3ControlPoint(mv,V,tmy,tmw,uvyi);Nurbs3ControlPoint(mv,V,tmz,tmw,uvzi);B3SplineControlPoint(mv,V,tmw,uvwi);for(k=0;k3*m。

14、v-17;k+)ptik0=uvxik;ptik1=uvyik;ptik2=uvzik;ptik3=uvwik;/计算双二次(2x2)Nurbs样条曲面所有控制多边形顶点,并保存在pt中/mu,mv分别为节点矢量U,V的最大下标值void Nurbs2FControlPoint(int mu,float U,int mv,float V,float px,float py,float pz,float W,float pt1001004)int i,j,k,dp;float tmx50,tmy50,tmz50,tmw50;float tmpx50100,tmpy50100,tmpz50100,。

15、tmpw50100;float uvx100100,uvy100100,uvz100100,uvw100100;for(i=0;imv-2;i+)dp=i*(mu-2);for(j=dp;jmu-2+dp;j+)tmxj-dp=pxj;tmyj-dp=pyj;tmzj-dp=pzj;tmwj-dp=Wj;Nurbs2ControlPoint(mu,U,tmx,tmw,tmpxi);Nurbs2ControlPoint(mu,U,tmy,tmw,tmpyi);Nurbs2ControlPoint(mu,U,tmz,tmw,tmpzi);B2SplineControlPoint(mu,U,tmw,。

16、tmpwi);for(i=0;i2*mu-7;i+)for(j=0;jmv-2;j+)tmxj=tmpxji;tmyj=tmpyji;tmzj=tmpzji;tmwj=tmpwji;Nurbs2ControlPoint(mv,V,tmx,tmw,uvxi);Nurbs2ControlPoint(mv,V,tmy,tmw,uvyi);Nurbs2ControlPoint(mv,V,tmz,tmw,uvzi);B2SplineControlPoint(mv,V,tmw,uvwi);for(k=0;k2*mv-7;k+)ptik0=uvxik;ptik1=uvyik;ptik2=uvzik;ptik。

17、3=uvwik;/-/计算双三次(3x3次)或双二次(2x2次)Nurbs样条曲面上所有的点并保存在bs中/nu,mv分别为节点矢量U,V的最大下标/uk,vk分别为B样条曲面(u,v)方向上的网格数/p为曲面的次数void NurbsFace(int p,int nu,float U,int uk,int mv,float V,int vk,float px,float py,float pz,float w,float bs1611613)int udk20,vdk20,i,j,k,l,hu,sv,du,dv;float tp1001004,td1611613;float tmx44,tm。

18、y44,tmz44,tmw44;du=nu-2*p;dv=mv-2*p;SetGridCount(du,uk,udk);SetGridCount(dv,vk,vdk);if(p=3)Nurbs3FControlPoint(nu,U,mv,V,px,py,pz,w,tp);if(p=2)Nurbs2FControlPoint(nu,U,mv,V,px,py,pz,w,tp);for(i=0;idv;i+)for(k=0;kdu;k+)for(j=i*p;jp+1+i*p;j+)for(l=k*p;lp+1+k*p;l+)tmxj-i*pl-k*p=tplj0;tmyj-i*pl-k*p=tplj1;tmzj-i*pl-k*p=tplj2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值