B樣條曲線
定義
B樣條的形式與Bezier曲線的定義方式相同,是B-樣條基函數的線性組合。
給定n+1個控制點\(P_i(i=0,1,...,n)\)和一個節點向量\(U=\{u_0,u_1,..., u_m\}\),且\(m=n+p+1\),依次連接這些控制點可以構成一個特征多邊形,k+1階(k次)B樣條曲線的表達式為
其中\(u_i\)稱為節點(knots),\(u_0 <= u_1 <= u_2 <= ... <= u_m\), 半開區間\([u_i, u_i+1)\) 是第i個節點區間。。如果基函數的節點是允許存在重復的,如果\(u_i\)出現了k次(k>1),那么稱其為k重節點。如果\(u_i\)僅出現一次,那么稱其為簡單節點。節點等間距(\(u_i+1 - u_i\)是一個常數,對\(0<=i<=m-1\)),節點向量或節點序列稱為均勻的;否則它是非均勻的。
基函數
B樣條的基函數由三個參數決定:階數p,參數u,第i個基函數,Cox-de Boor遞歸定義如下:
B樣條基函數\(N_{i,p}\)的作用范圍是局部的,因此與Bezier曲線不同,移動控制點\(N_{i,p}\)對B樣條的影響是局部的。其導數為
曲線形狀
由控制點的位置(n+1),節點位置(m+1),和曲線的次數p決定。
- 開B-樣條曲線:產生的曲線不會與控制折線的第一邊和最后一邊接觸。
- clamped B-樣條曲線:強制第一個節點和最后一個節點的重復度為p+1,那么產生的曲線就會分別與第一個控制點和最后一個控制點的第一邊和最后一邊相切,首尾點分別與首尾控制點相同。
- 閉B-樣條曲線:通過重復某些節點和控制點,產生的曲線會是閉曲線。會產生閉環
擬合
給定已知點集\(\{F_0,F_1,…,F_t\}\)共\(t+1\)個點,求B樣條曲線。其中要求必須經過所有點稱為插值擬合,否則稱為近似擬合,近似擬合必經\(F_0\)和\(F_t\),其他點可以不經過。下面是點集相同時兩種擬合對應的曲線。
近似擬合
插值擬合
插值擬合
由已知條件可知
1. 參數化
給\(F_i\)確定\(u_i\)的過程,稱之為參數化(Parameterization)。常見的參數化方法有三種:弦長累加法(chord length),向心參數法(也稱平方根法),統一節點法。其中前兩種最為常用。
- 弦長累加法:指的是,當前型值點\(Fi\)的參數,等於之前所有型值點長度的累加\(∑_{j=1}^i|F_{j−1}F_j|\)。這種方法是“Arc-Length”參數法的一種近似,選用弦長代替弧長,因此具有比較好的效果。
- 向心參數法:這個方法由波音公司的技術人員提出。指的是當前型值點的參數是由之前所有型值點長度的平方根累加的值\(∑_{j=1}^i\sqrt{|F_{j−1}F_j|}\),通常情況下,這個方法的效果要好於弦長累加法,尤其是在節點分布不均勻的情況下。
- 統一節點法:顧名思義,每個節點的間隔都是相等的。這種方法不怎么在實踐中獲得應用。
2.階次
B-Spline的三個要素是節點(序列)、階次、控制點。階次由我們確定。樣條曲線的性質是n階B樣條在節點處有n-1階連續性。這里選擇p=3,進而得出曲線的節點序列為(clamped B樣條曲線):
這樣就確定了每個節點對應的基函數的值,從而N已知,F已知,但前面方程\((1)\)是一個欠定方程,節點數為t+7個,對應控制點為m-p-1=t+3個,沒有唯一解,所以至少還需要與t有關的兩個邊界條件。
3.邊界條件
一般來說,最常用或者說最實用的邊界條件通常是兩條:曲線在首尾點的切矢量。常用的切矢量推導算法是”Bessel Tangents“。再結合B樣條的求導,可以知道首尾處的導數為
即
聯合(1)(2)式,即可求解出所有的控制點。