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

B样条曲线曲面NURBS曲线曲面C语言算法源程序

学习小结:前面学习了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)

P5 P10

P0 P6 P9

P7 P8

图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样条函数次数

int FindSource(int n,int p,float u,float U[])

{

int low,high,mid;

if(u==U[n+1])//特殊情况

return n;

//进行二分搜索

low=p;

high=n+1;

mid=(int)(low+high)/2;

while(uU[mid])

{

if(u

high=mid;

else

low=mid;

mid=(int)(low+high)/2;

if(u>=U[mid]&&u

break; //退出二分搜索

}

return mid; //返回区间下标

}

//计算所有非零B样条基函数并返回其值

//i为参数u所在的节点区间下标

void BasisFunction(int i,int p,float u,float U[],float N[])

{

int j,di,dp,k;

float tul,tur,left,right;

float tmpN[50][50];

for(k=0;k<=p;k++)

{

dp=0;

for(di=i+p-k;di>=i-k;di--)

{

if(u>=U[di]&&u

tmpN[di][0]=1;

else

tmpN[di][0]=0;

dp+=1;

for(j=1;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[d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值