ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 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;