B-spline Curves: Computing the Coefficients
本博客轉自前人的博客的翻譯版本,前幾章節是原來博主的翻譯內容,但是后續章節博主不在提供翻譯,后續章節我在完成相關的翻譯學習。
(原來博客網址:http://blog.csdn.net/tuqu/article/details/4749586)
原來的博主翻譯還是很好的,所以前幾章節直接借鑒參考原博主的內容。
盡管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] = [un, un+1]上, n 次非零基函數是: N0,n(u), N1,n(u), ..., Nn,n(u)。回憶B-樣條基函數的定義如下:
因為僅有的 0次非零基函數是Nn,0(u),下標 i 只能在0 和n之間。因此, ui是零而 ui+n和ui+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個貝塞爾基函數。因此,我們有下列結論: