B-spline Curves: Definition
給定 n + 1個控制點P0, P1, ..., Pn 和一個節點向量U = { u0, u1, ..., um }, p 次B-樣條曲線由這些控制點和節點向量U 定義
其中 Ni,p(u)是 p次B-樣條基函數。
B-樣條曲線形式與貝塞爾曲線相似 。不像貝塞爾曲線, B-樣條曲線包含更多資訊,即:一系列的 n+1 個控制點,m+1個節點的節點向量,次數 p。 注意n, m 和 p 必須滿足m = n + p + 1。更準确地,如果我們想要定義一個有 n + 1控制點的p次B-樣條曲線,我們必須提供n + p + 2 個節點 u0, u1, ..., un+p+1。另一方面,如果給出了一個m + 1 個節點的節點向量和n + 1 控制點,B-樣條曲線的次數是p = m - n - 1。對應于一個節點ui的曲線上的點, C(ui),被稱為節點點(knot point)。是以,節點點把B-樣條曲線劃分成曲線段,每個都定義在一個節點區間上。我們将在曲線細分頁證明這些曲線段都是 p 次的貝塞爾曲線。
盡管 Ni,p(u) 看起來像Bn,i(u), B-樣條基函數的次數(degree)是一個輸入數,而貝塞爾基函數的次數取決于控制點的數目。
為了改變B-樣條曲線的形狀,可以修改一個或多個控制參數:控制點的位置(n+1),節點位置(m+1),和曲線的次數p。
如果節點向量沒有任何特别的結構,那麼産生的曲線不會與控制折線(polyline)的第一邊(leg)和最後一邊(leg)接觸,如下面左圖所示。這種類型的B-樣條曲線稱為開(open )B-樣條曲線。 我們可能想強制曲線使得它分别與第一個控制點和最後一個控制點的第一邊和最後一邊相切,像貝塞爾曲線那樣。為了做到這些,第一個節點和最後一個節點必須是重複度為p+1。這就産生了所謂的clamped B-樣條曲線。參見下邊中間的圖。通過重複某些節點和控制點,産生的曲線會是 閉(closed)曲線。 這種情況,産生的曲線的開始和結尾連接配接在一起形成了一個閉環如下邊右圖所示。在本文中,我們将使用clamped曲線。
上圖有 n+1個控制點(n=9)以及 p = 3. 。那麼,, m 必須是13 是以節點向量有14個節點。為了有clamped效果,前p+1 = 4 和最後4個節點必須一樣。其餘14 - (4 + 4) = 6 個節點可在定義域任何位置。實際上,曲線是用節點向量 U = { 0, 0, 0, 0, 0.14, 0.28, 0.42, 0.57, 0.71, 0.85, 1, 1, 1, 1 }産生的。注意除了頭四個和最後四個節點,中間的節點幾乎是均勻分布的。 圖形也顯示了每個節點區間上的相應的曲線段。實際上,小三角是節點點。
術語的使用
我們使用開(open), clamped 和閉(closed)來描述三種類型的B-樣條曲線。但是,不是每一個作者都會使用相同的術語,并沒有一個标準用法的共識。例如,有些作者會使用 floating, open 和 periodic 來稱呼 開(open), clamped 和 閉(closed)曲線。其他有些作者會使用"periodic"來稱呼一個有均勻節點序列的開(open)B-樣條曲線。是以,當你讀其他文獻時,首先要看其定義。否則,你很可能會感到困惑。
B-spline Curves: Open Curves
如以前提到過的,如果第一個和最後一個節點沒有重複度 p+1,其中 p 是B-樣條曲線的次數(degree),曲線将不會分别與第一個控制點和最後一個控制點的第一邊和最後一邊相切。 該曲線是開(open) B-樣條曲線。在這種情況下,我們應關注一個額外的限制。在前頁 我們展示了一個基函數的計算執行個體,使用節點向量U = { 0, 0.25, 0.5, 0.75, 1 }, 其中 m = 4,如果基函數是1次的 (即, p= 1), 那麼有三個基函數N0,1(u), N1,1(u) 和 N2,1(u) 如下圖所示。
因為該節點向量不是 clamped,第一個和最後一個節點區間(即,[0, 0.25) 和 [0.75, 1)) 隻有一個非零基函數而第二和第三節點區間(即, [0.25, 0.5) 和 [0.5, 0.75)) 有兩個非零基函數。回憶 B-樣條基函數重要性質裡的在一個節點區間[ui, ui+1)有至多p+1個p 次非零基函數。是以,在這個例子中,節點區間[0,0.25) 和 [0.75,1)沒有基函數的“完全支援” ("full support")。一般來說,對次數p,區間 [u0,up) 和 [um-p, um] 不會有基函數的“完全支援”( "full support" ),當B-樣條曲線是開曲線時被忽略。是以,我們有下列重要的注意事項:
考慮一個由14個控制點(即,n = 13)定義的 6次 (即,p = 6) B-樣條曲線。其節點的數目是 21 (即, m = n + p + 1 = 20)。如果節點向量是均勻的, 節點是0, 0.05, 0.10, 0.15, ..., 0.90, 0.95 和 1.0。 開(open)曲線定義在[up, un-p] = [u6, u14] = [0.3, 0.7]上且與第一邊和最後一邊不相切。下面左圖顯示了曲線而右圖給出了B-樣條基函數。
盡管在兩端的節點區間沒有被利用,B-樣條曲線仍然是由所有控制點定義的。如在 B-樣條基函數頁所讨論的最多有p+1 個基函數Ni-p,p(u), Ni-p,p+1(u), ..., Ni,p(u) 在節點區間 [ui, ui+1)上非零。是以,在[up, ui+1)上有 p+1個非零函數: N0,p(u), N1,p(u), ..., Np,p(u)。這是一個“滿”數( "full" count)。注意 N0,p(u) 在 [up, up+1) 有它的尾巴,是以,控制點P0 對開(open)B-樣條曲線的貢獻小于大多數其他控制點。一個相似的參數可用來證明 Pn 也包括在曲線的定義中。
讓我們用一個執行個體來說明一個開曲線與clamped曲線之間的變化。 我們以一個由9個控制點(即, n = 8)和一個均勻節點向量{ 0, 1/13, 2/13, 3/13, ..., 12/13, 1 }定義的4次開B-樣條曲線為開始。如果我們将第二個節點 1/13 改變到 0 使得0 為雙重節點,圖中黃色曲線。實際上,該曲線和0是簡單節點的原始曲線幾乎是一樣的。現在,如果我們把第三個節點2/13改變到0使得0是重複度為3的節點,則結果是紅色曲線。如果第四個節點 3/13 改變到0 (重複度 4),産生的曲線是藍色的。如你所看到的,這三條開曲線彼此之間沒有很大不同。現在,讓我們把第五個節點4/13改變到0. 現在0是一個重複度5(即, p+1)的節點,曲線不僅通過第一個控制點而且與控制折線(ployline)(即,clamped)的第一邊相切。如你從圖中看到的,曲線的形狀劇烈地變化,将它的一個端點移到第一個控制點。如果我們把最後5個節點移到1也會發生同樣變化。
B-spline Curves: Closed Curves
有許多方法來産生閉曲線。簡單的一種就是wrapping控制點或者wrapping節點向量。
1.Wrapping控制點
假設我們想建構一個p次閉(closed)B-樣條曲線C(u),由n+1 控制點P0, P1, ..., Pn.定義。節點數目是m+1, 其中 m = n + p + 1. 這兒是建構過程:
(1)設計一個均勻 m+1 個節點的節點序列:u0 = 0, u1 = 1/m, u1 = 2/m, ..., um = 1。注意曲線的定義域是 [up, un-p].
(2)Wrap頭p 個和最後p 個控制點。更準确地,設P0 = Pn-p+1, P1 = Pn-p+2, ..., Pp-2 =Pn-1 and Pp-1 = Pn. 如下圖所示。
建構的曲線在連接配接點處 C(up) = C(un-p)是Cp-1 連續的。.
下面舉個例子圖 (a) 顯示了一個由10(n=9)個控制點和一個均勻節點向量定義的3次開(open)B-樣條曲線。在圖中,控制點對0 和7, 1和8, 以及2和9放置在互相靠近的地方來說明這個建構。圖 (b) 顯示了使得點0和7重疊的結果。 曲線的形狀沒有太大變化。那麼,控制點1和8重疊如圖(c)所示。很顯然曲線的第一點和最後一點的間距更近了。最後曲線變成一個閉曲線當控制點2和9重疊後,如圖(d)所示。
(2)Wrapping 節點
另一種建構閉B-樣條曲線的方法是wrapping節點。假設我們想要建構一個由n+1個控制點P0, P1, ..., Pn定義的p 次閉B-樣條曲線C(u) 。建構過程如下:
(1)增加一個新控制點 Pn+1 = P0.是以,控制點的數目是 n+2.
(2)找到一個合适的有 n+1節點的節點序列u0, u1, ..., un 。這些節點不必要是均勻的
(3)增加 p+2 個節點并 wrap 頭 p+2個節點: un+1 = u0, un+2 = u1, ..., un+p = up-1,un+p+1 = up, un+p+2 = up+1 ,如下圖所示。這樣,我們有n+p+2 = (n+1) + p + 1 個節點
(4)定義在上述建構的 n+1個控制點和n+p+2 個節點上的 p 次開B-樣條曲線C(u)是一個閉曲線,在連接配接點處C(u0) = C(un+1)有Cp-1 連續性。注意閉曲線的定義域是 [u0, un+1]