導航:首頁 > 源碼編譯 > 三次b樣條曲線演算法

三次b樣條曲線演算法

發布時間:2025-01-22 22:59:43

『壹』 b樣條曲線是在什麼數學里講的

書名不清楚..不過在網上找到這個..不知道你用不用得上.

五、B樣條曲線的矩陣表示
1)二階B樣條曲線
設空間P0 P1, …., Pn為n+1個控制點,節點矢量為 其中每相鄰兩個控制點之間可以構造出一段二階B樣條曲線。其中的第j=i-1段二階B樣條曲線Pj(t)的矩陣表示為:

其中, 。
對於二階均勻B樣條曲線,其矩陣表示與非均勻B樣條曲線的相同:


2)三階B樣條曲線
給定節點矢量為 ,n+1個控制點為P0,P1, …., Pn。其中每相鄰三個點可構造出一段二次的B樣條曲線。其中的第j(=i-2)段三階B樣條曲線Pj(u)的矩陣表示為:

其中,

對於三階均勻B樣條曲線,其矩陣表示為


三階均勻B樣條曲線的端點位置、一階導數和二階導數矢量分別為:

Pi,3(0)=(Pi+Pi+1)/2,
Pi,3(1)=(Pi+1+Pi+2)/2;
P'i,3(0)= Pi+1-Pi,
P'i,3(1)=Pi+2-Pi+1,
P'i,3(1)=P'i+1,3(0);
P''i,3(t)=Pi-2Pi+1+Pi+2 ,

三階均勻B樣條曲線的首末點通過相應邊的中點;首末點的切矢方向與相應邊重合;二階導數矢量等於該曲線的兩條邊矢量Pi+1-Pi 和Pi+2-Pi+1所構成的對角線矢量。
三階均勻B樣條曲線段為拋物線,兩相鄰曲線段之間為一階連續。
3)四階B樣條曲線
設節點矢量為 ,控制點為P0 P1, …., Pn,其中每相鄰四個點可構造出一段三次的B樣條曲線。其中的第j(=i-3)段三次B樣條曲線Pi(u)的矩陣表示為:
;。
其中,
,
m3,2 =-m2,2/3- m3,3-(ti+1-ti)2/[( ti+2-ti)(ti+2-ti-1)],mr,j是第r行第j列的元素。
第j(=i-3)段三次均勻B樣條曲線Pj(t)的矩陣表示:

三次均勻B樣條曲線的端點位置、一階導數和二階導矢量分別為:
Pi,4(0)=(Pi+4Pi+1+Pi+2)/6,
Pi,4(1)=(Pi+1+4Pi+2+Pi+3)/6;
P'i,4(0)=(Pi+2-Pi )/2,
P'i,4(1)= (Pi+3-Pi+1 )/2,
P'i,3(1)= P'i+1,3(0);
P''i,4(0)= Pi-2Pi+1+ Pi+2,
P'i,4(1)= Pi+1-2Pi+2+ Pi+3。
三次均勻B樣條曲線段的起點位於以Pj+1Pj和Pj+1Pj+2為鄰邊的平行四邊形的對角線的1/6處;起點的切矢量與PjPj+2平行,切矢量的長度 ;曲線段起點的二階導數矢量等於以Pj+1Pj和Pj+1Pj+2為鄰邊所構成的平行四邊形的對角線矢量。
4)k階B樣條曲線
設節點矢量為 ,控制點為P0,P1, …., Pn,其中每相鄰k個控制點可構造出一段k階B樣條曲線。其中的第j(=i-k+1)段曲線Pi-k+1(u)的矩陣表示為:
(6-4-4)
;
;

其中,Mk(i)稱為k階B樣條基矩陣,它由下列遞歸公式計算:
(6-4-5)

如果 ,i=0,1,…,n+k-1,則由(6-4-4)式所定義的曲線Pi-k+1(u) (i=k-1, k,…,n)為均勻B樣條曲線,這時,k階B樣條基矩陣Mk(i)與i無關,簡記為Mk:

上式也可以顯式地表示為:

其中,


這裡面也有一個.
http://baby66.bokee.com/3678017.html
希望給對你有所幫助.

『貳』 三次均勻B樣條插值演算法

三次樣條插值(Cubic Spline Interpolation)簡稱Spline插值,是通過一系列形值點的一條光滑曲線,數學上通過求解三彎矩方程組得出曲線函數組的過程。
實際計算時還需要引入邊界條件才能完成計算。一般的計算方法書上都沒有說明非扭結邊界的定義,但數值計算軟體如Matlab都把非扭結邊界條件作為默認的邊界條件。

『叄』 求VB下三次B樣條曲線的演算法原代碼 十萬火急求

#define BEZ_N 10
#include<graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include<conio.h>
#include<math.h>
//int control[4][2]={20,20,100,100,300,100,500,20};
double p0[BEZ_N][2];
double p1[4][2]={10.0,10.0,200.0,100.0,250.0,400.0,600.0,100.0};
int midx,midy,B_N,B_N1;
char RET='a';
curve_split(double p[BEZ_N][2], double q[BEZ_N][2],double r[BEZ_N][2])
{
int i,j;
for(i=0;i<=B_N;++i)
{
q[i][0]=p[i][0]; q[i][1]=p[i][1];
}
for(i=1;i<=B_N;++i)
{
r[B_N+1-i][0]=q[B_N][0]; r[B_N+1-i][1]=q[B_N][1];
for(j=B_N;j>=i;--j)
{
/* line(q[j][0]+midx,midy-q[j][1],q[j-1][0]+midx,midy-q[j-1][1]);
RET=getch();
if(RET=='e')
return(0);*/

q[j][0]=(q[j-1][0]+q[j][0])/2;
q[j][1]=(q[j-1][1]+q[j][1])/2;
}
}
r[0][0]=q[B_N][0]; r[0][1]=q[B_N][1];
return(0);
}
double dd(double ax,double ay,double bx,double by,double cx,double cy)
{
double d,k,A,B,C,AB;

k=(by-cy)/(bx+cx);
A=k;B=1;C=-(k*bx+by);
AB=sqrt(A*A+B*B);
d=fabs(A*ax+ay+C)/AB;
return(d);
}
max_d(double p[BEZ_N][2])
{
double d,d_max=0.0;
int i,j;

for(i=1;i<B_N;++i)
{
d=dd(p[i][0],p[i][1],p[0][0],p[0][1],p[B_N][0],p[B_N][1]);
if(d_max<d)
d_max=d;
}
return(d_max);
}
curve(double p[BEZ_N][2])
{
double d1,d2,d;
double q[BEZ_N][2],r[BEZ_N][2];

// if(RET=='e')
// return(0);
// d1=dd(p[1][0],p[1][1],p[0][0],p[0][1],p[2][0],p[2][1]);
if(max_d(p)<2)
{line(p[0][0]+midx,midy-p[0][1],p[B_N][0]+midx,midy-p[B_N][1]);
//getch();
}
else
{
curve_split(p,q,r);
curve(q);
curve(r);
}
return(0);
}
ini()
{
int i;
for(i=0;i<BEZ_N;++i)
{
if(i<3)
{ p0[i][0]=p1[i][0];p0[i][1]=p1[i][1];}
else
{ p0[i][0]=0.0;p0[i][1]=0.0;}
}
return(0);
}
main()
{
int gdriver=DETECT,gmode;
int x_max,y_max;
int x=1,y=1,i,j,col;
double p1[6][2]={10.0,10.0,100.0,200.0,200.0,220.0,250.0,230.0,300.0,200.0,400.0,10.0};

initgraph(&gdriver,&gmode,"");
midx = getmaxx()/16;
midy = getmaxy();
// ini();
/* printf("\n input number of control pot");
scanf("%d",&B_N);
B_N1=B_N+1;
for(i=0;i<=B_N;++i)
{
printf("\n P%d(x,y)",i);
scanf("%d%d",&x,&y);
p0[i][0]=x;p0[i][1]=y;
} */
B_N=5;
for(i=0;i<=B_N;++i)
{
p0[i][0]=p1[i][0];p0[i][1]=p1[i][1];
}

setcolor(15);
for(i=0;i<B_N;++i)
line((int)p0[i][0]+midx,midy-(int)p0[i][1],(int)p0[i+1][0]+midx,midy-(int)p0[i+1][1]);
setcolor(4);
if(getch()!='e')
curve(p0);
getch();
cleardevice();
closegraph();
return(0);
}

閱讀全文

與三次b樣條曲線演算法相關的資料

熱點內容
結婚日子最好的演算法 瀏覽:789
安卓怎麼把數據傳到蘋果里 瀏覽:499
編譯器標識 瀏覽:789
編程珠璣第三章 瀏覽:782
windows如何開啟tftp伺服器 瀏覽:107
歐姆龍plc編程指令表 瀏覽:186
程序員遠程收入不穩定 瀏覽:860
演算法原理怎麼寫 瀏覽:469
有個動漫女主藍頭發是程序員 瀏覽:998
雲伺服器資源評估 瀏覽:882
微雲下載文件夾是空的 瀏覽:3
r9數控車的編程 瀏覽:403
為什麼刪不掉ksafe文件夾 瀏覽:291
理科男學編程用什麼電腦 瀏覽:839
安陽彈性雲伺服器 瀏覽:570
壓縮空氣儲罐有效期 瀏覽:408
英國文學PDF 瀏覽:175
軟體編程需求 瀏覽:626
廣州哪裡解壓 瀏覽:253
手機小視頻怎麼壓縮 瀏覽:915