BÑùÌõÇúÏßÇúÃæºÍNURBSÇúÏßÇúÃæCÓïÑÔËã·¨Ô´³ÌÐò ÏÂÔØ±¾ÎÄ

ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2026/6/29 11:22:01ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£

ѧϰС½á£ºÇ°ÃæÑ§Ï°ÁËBezierÇúÏߣ¬BÑùÌõ»ùº¯ÊýºÍBÑùÌõÇúÏßµÄһЩ»ù´¡ÖªÊ¶¡£ÕÆÎչؼüÎÊÌâÊÇÒ»ÌõBÑùÌõÇúÏß¼äµÄ¶à¶ÎÇúÏߵĹ⻬Á¬½Ó¡£ÒòΪÏÖÔÚÊÇÓöà¶ÎBezierÇúÏßÀ´Ãè»æÒ»ÌõBÑùÌõÇúÏߣ¬ËùÒÔÎÊÌâ±äΪÁ½¶ÎBezierÇúÏß¼ä¹â»¬Á¬½Ó¡£Á½¶ÎBezierÇúÏ߶Σ¨3´Î£©B1ºÍB2¹â»¬Á¬½ÓµÄÌõ¼þ£º

0

£¨1£©.ÒªÇóB1ºÍB2Óй²Í¬µÄÁ¬½Óµã£¬¼´GÁ¬Ðø¡£

1

£¨2£©.ÒªÇóB1ºÍB2ÔÚÁ¬½Óµã´¦ÓгɱÈÀýµÄÒ»½×µ¼Êý£¬¼´GÁ¬Ðø¡£Óɶ˵㴦µÄÒ»½×µ¼Êý

B?1(1)?3(P3?P2),B?2(0)?3(Q1?Q0),ΪʵÏÖG1Á¬Ðø£¬ÔòÓУº

B?2(0)?B?1(1) ¼´£ºQ1?Q0?P3?P2 ÕâÒ²±íÃ÷£¬P2,P 3(Q0),Q1Èýµã¹²Ïß¡£ÈçÏÂͼ±íʾÁËÒ»Ìõ3´ÎBÑùÌõÇúÏßµÄËùÓпØÖƶà±ßÐΣº (P) P 3

P

41112

P (P) (P)

510

P P

069

P P P

78

P P ͼ5.3´ÎBÑùÌõÇúÏߺÍËùÓпØÖƶà±ßÐÎ

012

ͼ5ÖУ¬P0ÖÁP6Ϊԭʼ3´ÎBÑùÌõÇúÏß¿ØÖƶà±ßÐζ¥µã£¬PÖÁPÊǼÆËãºó×îÖÕÐγÉBÑùÌõÇúÏß¿ØÖƶà±ßÐζ¥µã¡£

ͼ6.Ë«¶þ´Î£¨2x2£©BÑùÌõÇúÃæ

6.BÑùÌõÇúÏßÇúÃæºÍNURBSÇúÏßÇúÃæµÄCÓïÑÔʵÏÖËã·¨Ô´³ÌÐò

#ifndef _mynurbs_h #ifndef _MYNURBS_H

1

2

#include \#include \

//*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 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

low=mid;

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

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

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[di+1][j-1]; } }

N[i-k]=tmpN[i-k][p]; } }

//----------------------------------------------------------------------- //¼ÆËã»ùº¯ÊýµÄ1½×µ¼Êý²¢±£´æÔÚNP[]ÖÐ //iΪ²ÎÊýuËùÔڵĽڵãÇø¼äϱê //pΪBÑùÌõº¯Êý´ÎÊýP>2

void 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 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]=0; dp+=1;

for(j=1;j