學習B樣條曲線需要先學習貝塞爾曲線,若未了解,看我一篇上部落格https://blog.csdn.net/weixin_42513339/article/details/83019610
貝塞爾函數不足
由于貝塞爾曲線存在以下不足:
1 )缺乏局部修改性,即改變某一控制點對整個曲線都有影響。
2 )n 較大時,特征多邊形的邊數較多,對曲線的控制減弱。
3 )幂次過高難于修改。(而在外形設計中,局部修改是随時要進行的)。
是以提出了B樣條曲線,B樣條曲線有以下優點:
1 )逼近特征多邊形的精度更高。
2 )多邊形的邊數與基函數的次數無關。
3 )具有局部修改性。
首先,貝塞爾公式為:
其中, 為伯恩斯坦基函數(BEZ)
是以公式可以寫成
B樣條曲線
B樣條曲線,用B樣條基函數代替伯恩斯坦基函數如下所示:
這裡的你隻是一個比例系數,但是這裡把你從0到1分成很多段。如果節點等間距(即 ui +1 - ui 是一個常數,對0 <= i <= m - 1),節點向量或節點序列稱為均勻的;否則它是非均勻的。
節點可認為是分隔點,将區間[ u0,um]細分為節點區間。所有B樣條基函數被假設定義域在[ u0,um ]上。uo = 0和um = 1,是以定義域是閉區間[0,1]。
相關定義
在圖形學書裡,也寫明了若此時線段的頂點個數為m + n + 1(m為最大段号,n為階次)
B樣條曲線主要也是為了平滑曲線,而且這裡的階次,換個說法就是目前這個點能夠影響它附近多少個點。
多重節點與簡單節點
如果一個節點ui出現k次(即,ui = ui + 1 = ... = ui + k-1),其中k> 1,ui是一個重複度(multiplicity)為k 的多重節點,寫ui(k否則),如果使用者界面隻出現一次,它是一個簡單節點。
B樣條基函數
區間我的ķ次B樣條基函數,寫為鎳,K(U),遞歸定義如下:
K = 0時的Ni,k(u)
如果次數為零(即k = 0),這時基函數都是階梯函數,如果你是在第i個節點區間[ui,ui + 1)上,那麼基函數的Ni,0(U)= 1。
例:
有四個節點U = {0,1,2,3},節點區間0,1,2分别對應[0,1),[1,2),[2,3]。(這裡你的範圍也隻是一個比例關系)
畫出圖如下所示:
若K = 1時的的Ni,K(U)
下圖中,黑色和紅色線分别是N0,1(u)和N1,1(u)。
PS:
為了了解 階數k 大于0時,計算Ni,k(u)的方法,我們使用三角計算格式。所有節點區間列在左邊(第一)列,所有零次基函數在第二列。見下圖。
從這一張圖裡,我們可以很清楚的看到,如果想計算某個基函數,那麼就必須要知道哪些零次基函數,然後需要哪兩個計算,都可以從圖裡看出來。
比如:
我們繼續計算K = 2時的鎳,K(U),如下:
其中,當你在[0,1)上時,這種情況,隻有N0,1(u)對N0,2(u)的值有貢獻。是以,N0,1(u)是你,得到
你在[1,2]上:
這種情況,N0,1(u)和N1,1(u)都對N0,2(u)有貢獻。在[1,2]上N0,1(u)= 2 - u和N1,1( u)= u - 1,得到:
你在[2,3]上:
這種情況,隻有N1,1(u)對N0,2(u)有貢獻。在[2,3]上N1,1(u)= 3 - u,得到:
可以最後得到N0,2(u)函數圖形
基函數的非零定義域的确定
實際上也是主要通過圖來看如下圖,我們可以得知:如果我們要計算N1,3(U),那麼它的有效定義域是u1到u5通過下圖可以直接看出。
說的更加理論一點就是:
基函數Ni,p(u)在[ui,ui + k + 1)上非零。或,相等地,Ni,k(u)在k + 1個節點區間[ui,ui + 1],[ui + 1,ui + 2),...,[ui + k,ui + k + 1)上非零。
在這裡,我們可以觀察出重要的一點,為什麼B樣條曲線的頂點數是m + n + 1,因為跟它的定義域是有關的。
非零定義域對應的基函數
與上面正好相反,我們可以通過基函數的階數,來确定他的定義域。
同樣,一個定義域,我們也可以看出(如下圖):
任何一個節點區間[ui,ui + 1],最多有k + 1個k次基函數非零,即:Ni-k,k(u),Ni-k + 1,k(u),Ni-k + 2,k(u),...,Ni-1,k(u)和Ni,k(u)。
系數的意義
第一項,Ni,k-1(u),在[ui,ui + k)上非零。如果u是在該區間,那麼你 - ui是u到該區間左端的距離,區間長度為ui + k - ui,(u - ui)/(ui + k - ui)是你在上述區間的歸一化位置。
第二項,Ni + 1,k-1(u),在[ui + 1,ui + k + 1)上非零。如果u在該區間,那麼ui + k + 1 - u是u到該區間右端的距離,ui + k + 1 - ui + 1是區間長度,(ui + k + 1 - u)/(ui + k + 1 - ui + 1)是u在上述區間的歸一化位置。