B-spline Curves 學習之B樣條曲線的係數計算與B樣條曲線特例(6)

               B-spline Curves: Computing the Coefficients

  儘管de Boor算法是一個計算對應於給定u的B-樣條曲線上的點的標準方法, 我們許多情況下(例如,曲線插值和逼近)真正需要的是這些係數。我們將闡述一個簡單方法來做這個。

  給定一個由 n+1個控制點P0, P1, ..., Pn, 和 m+1個節點 u0=u1=...=up=0, up+1, up+2, ..., um-p-1, um-p=um-p+1=...= um=1定義的p 次clamped B-樣條曲線。對於任何給定在[0,1]上的 u ,我們想計算係數N0,p(u),N1,p(u), ..., Nn,p(u) 。一個簡單方法是使用下列遞推關係:

  

  但是這是一個非常耗時的過程。爲了計算 Ni,p(u), 我們需要計算 Ni,p-1(u)和Ni+1,p-1(u). 爲了計算Ni,p-1(u), 我們需要計算Ni,p-2(u) 和 Ni+1,p-2(u). 爲了計算Ni+1,p-1(u), 我們需要Ni+1,p-2(u)和 Ni+2,p-2(u). 如你們所看到的, Ni+1,p-2(u)出現了兩次,因此,遞歸計算會重複。當遞歸繼續深入,會出現更多的重複計算。這與在頁討論的de Casteljau算法的遞歸版本很相似。因此,計算速度非常慢。

  有容易的方法。設 u 在節點區間[uk,uk+1)上。. B-樣條基函數的重要性質 說明最多 p+1個p 次基函數在[uk,uk+1)上非零,即: Nk-p,p(u), Nk-p+1,p(u), Nk-p+2,p(u), ..., Nk-1,p(u), Nk,p(u)。通過定義,在[uk,uk+1)上的0次僅有的非零基函數是Nk,0(u)。結果,從.Nk,0(u)出發計算係數是以一個 "fan-out" 三角形式,如下圖所示:

  

  因爲在 [uk,uk+1)上 Nk,0(u) = 1而其他0次B-樣條基函數在[uk,uk+1)上是零,我們可以從 Nk,0(u)開始而計算1次基函數 Nk-1,1(u) 和 Nk,1(u)。從這兩個值,我們可以計算2次基函數 Nk-2,2(u), Nk-1,2(u) 和Nk,2(u)。這個過程重複直到所有p+1 個非零係數計算出來。

  在這個計算中, “內部”值如 Nk-1,2(u)有一個西北向前驅 (即, Nk-1,1(u))和一個西南向的前驅 (即,Nk,1(u));上述三角如Nk-1,1(u)的東北方向邊界上的值只有一個西南向前驅 (即, Nk,0(u));這個三角如Nk,2(u)的東南方向邊界上的值只有一個西北前驅 (即, Nk,1(u))。因此, 在東北 (resp., 東南)方向邊界上的值使用定義中的遞歸關係的第二 (resp., 第一)項 。只有內部值使用全部兩項。基於這個觀察,我們有下列算法:

  

  

  上述算法不是很有效的算法。它的目的是爲了以一個直覺容易理解的方式說明思想。 數組N[ ] 保存所有中間值和最後結果。對一個次數 d, N[i] 保存了Ni,d(u)的值,且,最後,N[k-d], N[k-d+1], ..., N[k] 含有非零係數。計算以 d=1開始因爲我們知道僅有的非零基函數是 Nk,0(u)如果 u 在節點區間 [uk,uk+1)上。 外循環使得次數 d 從 1到  p。 begin 後面的第一次賦值是僅使用一項(即,三角中的西南項, Nk-d+1,d-1(u)),計算 Nk-d,d(u) , 內部 for 循環計算 “內部”項,而外循環中最後一個語句僅使用一項(即,三角中的西北項,  Nk,d-1(u)) 計算 Nk,d(u)。

  你能使這個算法更有效嗎?

           

                       B-spline Curves: A Special Case

  B-樣條曲線:特例

  如果我們有 2n+2 個節點 u0 = u1 = ... = un = 0及 un+1 = un+2 = ... = u2n+1 = 1 (即,頭 n+1 個是零,而後 n+1是1), n 次B-樣條基函數是什麼?

  因爲每個 u 在 [0,1] = [unun+1]上, n 次非零基函數是: N0,n(u), N1,n(u), ..., Nn,n(u)。回憶B-樣條基函數的定義如下:

  

  因爲僅有的 0次非零基函數是Nn,0(u),下標 i 只能在0 和n之間。因此, ui是零而 ui+nui+n+1是1。結果,上邊第二個等式可重寫爲如下式: 

  

  如果我們進行如頁討論的那樣以一個三角形式計算N0,n(u), N1,n(u), ..., Nn,n(u) ,那麼我們有下圖。在該圖中,每個東北(resp., 東南)邊界箭頭意味這乘1-u (resp.u)到在箭頭尾部的項上。注意計算中有n 步驟,每步獲得每列。因此, Nn,0(u) 對 N0,n(u)的貢獻是 (1-u)n, 而Nn,0(u)的貢獻對Nn,n(u)是un.

  

  現在,考慮一般項 Ni,n(u)的計算。 Nn,0(u) 對Ni,n(u)計算的貢獻可用"path-counting"技術確定,其用來展示de Casteljau算法的正確 以及貝塞爾曲線的更高次導數的計算中。每個從 Nn,0(u) 到 Ni,n(u) 遇n 箭頭其中i 是東南邊界 而 n-i 是東北邊界。 那些東北(resp., 東南)邊界箭頭意味着對尾部的項乘以1-u (resp.u)。因此,Nn,0(u) 對 Ni,n(u)的貢獻沿着一個單path是 ui(1-u)n-i 。從 Nn,0(u) 到 Ni,n(u)的paths總數是C(n,i)。更準確地,paths的數目等於放置 i 個東南邊界箭頭在n 個位置不同方法的數目。剩餘 n-i 位置用東北邊界箭頭充滿。這 n 個箭頭準確地描述了從 Nn,0(u) 到 Ni,n(u)的一個單路徑(path)。因爲每個路徑(path)貢獻  ui(1-u)n-i 給計算且因爲有C(n,i) 個路徑,Nn,0(u) 對 Ni,n(u)的總貢獻是

  

  這就是 n次第i個貝塞爾基函數。因此,我們有下列結論:

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章