B-spline Curves: Moving Control Points
本博客轉自前人的博客的翻譯版本,前幾章節是原來博主的翻譯內容,但是后續章節博主不在提供翻譯,后續章節我在完成相關的翻譯學習。
(原來博客網址:http://blog.csdn.net/tuqu/article/details/4749586)
原來的博主翻譯還是很好的,所以前幾章節直接借鑒參考原博主的內容。
B-樣條曲線:移動控制點
移動控制點是改變B-樣條曲線形狀的最明顯的方法。在前面頁討論的局部修改方案說明了修改控制點 Pi 的位置僅影響在區間[ui, ui+p+1)上的曲線 C(u) 。其中 p 是B-樣條曲線的次數。實際上,形狀的改變是在控制點被移動方向上的 t平移 。更准確地,如果控制點Pi向某個方向移動到一個新位置Qi ,那么點C(u),其中 u 在[ui, ui+p+1)上,會以相同方向從Pi 移動到 Qi。 但是,移動的距離點與點之間是不同的。下圖中,控制點 P4 從左圖位置移到中圖新位置最后到右圖最終位置。可看到那些對應節點的點(小三角標記)也以相同方向移動。
讓我們看些細節。假設C(u) 是一個給定的p 次B-樣條曲線定義如下:
設控制點 Pi 被移動到一個新位置Pi + v. 。那么,新 p 次B-樣條曲線 D(u)如下:
因此,新曲線D(u)是簡單的原始曲線C(u)的和以及一個平移向量Ni,p(u)v。 因為 Ni,p(u)在區間 [ui,ui+p+1)上非零,如果u 不在該區間,這個“平移”項為零。因此,移動一個控制點僅影響給定曲線部分形狀。 下面左曲線是個由13個控制點 control points (即, n = 12)和18個節點(即, m = 17)定義的4次 (即, p = 4)B-樣條曲線 。這些18個節點都是簡單的並定義了一個clamped曲線(即,u0 = u1 = u2 = u3 = u4 = 0 和 u13 = u14 = u15 = u16 = u17 = 1)。剩余的節點定義了9個節點區間,因此如圖所示有9個曲線段。這9個節點區間和曲線段命名如下:
現在讓我們移動 P6。結果顯示在上面右圖。如你們所看到的,曲線以同樣方向移動。P6 的系數是 N6,4(u), 其在[u6, u11)上非零。因此,移動 P6 影響曲線段3, 4, 5, 6 和7。曲線段1, 2, 8和9不受影響。
來自強凸包性質的有用結果
回憶 強凸包性質,如果u位於 [ui,ui+1),那么 C(u) 位於由控制點Pi, Pi-1, ..., Pi-p+1, Pi-p定義的凸包內。這有助於幫助我們進行下列設計任務:
如果 u 位於節點區間 [ui,ui+1)上,那么C(u) 位於由 p+1個控制點Pi, Pi-1, ..., Pi-p+1, Pi-p定義的凸包內。因為這對所有在該區間的u 都成立,所以在該節點區間的曲線段完全位於該凸包內。如果所有這些 p+1 個控制點是共線的(即,在一條直線上),凸包退化到線段,它所包含的曲線段也是如此。 結果,在節點區間 [ui,ui+1)上的曲線段變成了直線段。注意在這個情況下只有這個曲線段變成了直線段。其他曲線段仍然是非線性的。
讓我們來看一個例子。上面的圖由 n = 15 (即,16個控制點), p = 3 (次數為3) 和m = 19 (即,20個節點)。注意頭四個和最后四個節點是clamped。圖 (a)是給定的B-樣條曲線。 讓我們使得P9, P8, P7 和P6 共線。因此,在 [u9,u10)上的曲線段位於由 P9, P8, P7 和P6定義的凸包內。 因為這個凸包是直線段,所以曲線段也必須是直線段。記住頭四個節點是clamped因此頭三個節點區間不存在。因為[u9,u10)是第7個節點區間,第7段退化為直線段P7P8。這通過圖 (b), (c) 和 (d)說明。
但是,為什么在 [u9,u10)上的曲線段只退化到曲線段? 看圖(b)。陰影部分區域是 u 剛要進入enters [u9,u10)前的凸包。這個凸包由控制點 P8, P7, P6 和 P5定義,其還不是一條直線段。 一旦 u 進入[u9,u10),曲線段退化 (圖 (c)).在u 離開[u9,u10)的同時,出現了一個新的凸包(圖(d))。
圖 (e) 有 P5 及其四個后繼共線。該曲線包含多於一個直線段。 圖 (f) 有 P10 和它的5個后繼共線;但是,它被移動到P8 和 P9之間的位置。這導致相應曲線段的部分成為一條直線(為什么?)
(2)強制B-樣條曲線經過一個控制點:讓p個相鄰控制點重合(identical )
考慮控制點Pi。因為在節點區間 [ui, ui+1)上的曲線段完全位於由Pi, ..., Pi-p+1,Pi-p定義的凸包內,如果我們使得前p 個控制點重合(即, Pi = Pi-1 = ... = Pi-p+1),凸包退化為一條直線段, Pi-pPi 而曲線必經過Pi。
上面左圖的曲線是3次的。如果 P5 移到與 P6重合,曲線也移動更接近 P6 但還沒有經過它。這如中圖所示。注意曲線段的數目沒有因為這個移動而改變;但是 P5 附近的小三角標記移動到更接近 P6。 如果 P4 被移到與P6 = P5 重合,曲線經過P6 且對應於節點的點因為移動而與控制點P4 重合。
(3) 強制B-樣條曲線與控制折線的一邊相切:讓Pi-p, Pi-p+1 = Pi-p+2 = .... = Pi-1 = Pi 及Pi+1 共線
上面將 p 個相鄰控制點重合。在那個控制點上,連續性是C0 因為曲線有一個尖頭(見上面右圖)。 但是,一個B-樣條曲線在簡單節點上是 Cp-1 在其他空間是無限可微的,在邊Pi-pPi 上的控制點 Pi 上的曲線是Cp-1 連續的(退化控制點重新編號為i)而在邊PiPi+1 上的控制點Pi 也是 Cp-1 連續的。因此,如果我們使得 Pi-p, Pi 和 Pi+1 共線,只要兩個相鄰曲線段在該節點上沒有尖頭,它們在 Pi是Cp-1 連續的。
在上面圖中,曲線的次數是 2。如果我們使得控制點2, 3, 4 和 5 共線而 3 和 4 重合,我們得到右圖。共線保證了曲線段位於直線上而重合控制點強制 C3-1 = C2 連續。
B-spline Curves: Modifying Knots
B-樣條曲線:修改節點
因為B-樣條曲線是許多曲線段的組合,每個定義於一個節點區間上,修改一個或多個節點位置會改變相應的曲線段和節點區間,因此改變曲線的形狀。
下圖描述了修改一個單節點的效果。它是一個6次B-樣條曲線,有17個節點,最前7個和最后7個在端點上是clamped,而內部節點是0.25, 0.5 和 0.75。初始曲線在左圖顯示。如果節點0.25 移動到0.1,曲線的形狀改變,原來的C(0.25)向下移動到一個新位置。如果節點0.5移動到 0.1使得節點0.1變成一個雙重節點 (重復度2),曲線的形狀移動到左邊;但是C(0.1) 向上移動到接近原始點(即,原來的 C(0.25))的位置。結果顯示在右圖。盡管我們在 0.1 有一個雙重節點以及在0.75另一個節點非均勻地將定義域[0,1] 划分成三個節點區間,B-樣條曲線被它們相應點幾乎均勻地划分。
下圖顯示了三條曲線的形狀的改變,每個由 10 (n=9)個控制點定義,次數是6。它們內部節點向量是 (0.25,0.5,0.75) - 紅色曲線, (0.25,0.25,0.75) - 藍色曲線, (0.25,0.25,0.25) -黑色曲線。
實際經驗告訴我們修改節點位置不僅不可預測而且不令人滿意。更准確地說,因為不清楚B-樣條曲線會對節點向量的改變作怎樣的反應,通過改變節點來修改B-樣條曲線 通常都不令人滿意而且很難達到設計目的。
多重節點對產生期望的結果有幫助。回憶前面討論的多重節點的性質,增加一個內部節點的重復度會減小在該節點的非零基函數的數目。實際上,如果該節點的重復度是 k, 最多在該節點上有 p - k + 1 個非零函數。而且,在該節點的基函數是Cp-k 連續的。
假設一個節點有重復度 p-k,在該節點上有k+1 個非零基函數且曲線上的相應點位於由控制點(與那些非零基函數相對應)定義的凸包內。如果 k = p - 1, 有兩個非零函數而相應的凸包是直線段。
如果 k = p, 只有一個非零基函數在該節點上,只有一個控制點有非零系數。結果,曲線通過該點。
上面圖 (a),顯示了一個5次B-樣條曲線,相對應於標記的節點點的節點移動到它前面的節點,構建了一個重復度2的節點。結果在圖 (b), 其與原始圖沒有太大差別。然后,下一個節點 (用矩形框標記)也被移動到產生的節點 ,構建了一個重復度3的節點。產生的曲線朝控制折線的一條邊移動。再移動一個節點構建一個重復度4的新節點。這使得相應的點(橢圓標記)位於一條邊上。最 后,僅剩的一個節點移到與其它節點結合起來。由於它的重復度是5而 p=5, 只有一個非零系數因此使得曲線通過該控制點。如圖(e)所示,該控制點是P5 。