B樣條曲線曲面(附代碼)


1 B樣條曲線

1.1 B樣條曲線方程

B樣條方法具有表示與設計自由型曲線曲面的強大功能,是形狀數學描述的主流方法之一,另外B樣條方法是目前工業產品幾何定義國際標准——有理B樣條方法 (NURBS)的基礎。B樣條方法兼備了Bezier方法的一切優點,包括幾何不變性,仿射不變性等等,同時克服了Bezier方法中由於整體表示帶來不具有局部性質的缺點(移動一個控制頂點將會影響整個曲線)。B樣條曲線方程可表示為

clip_image002[4]

其中,di(i=0,1...n)為控制頂點(坐標),Ni,k(i=0,1...n)k次規范B樣條基函數,最高次數是k。基函數是由一個稱為節點矢量的非遞減參數u的序列Uu0u1≤...≤un+k+1所決定的k次分段多項式。

B樣條的基函數通常采用Cox-deBoor遞推公式:

clip_image004[14]    (2)

 

式中i為節點序號,k是基函數的次數,共有n+1個控制頂點。注意區分節點和控制頂點,節點是在節點矢量U中取得,控制頂點則是坐標點,決定B樣條的控制多邊形Cox-deBoor遞推公式是B樣條曲線的定義的核心,該公式在程序中的實現可采用遞歸的方式:

 1 function Nik_u = BaseFunction(i, k , u, NodeVector)
 2 % 計算基函數Ni,k(u),NodeVector為節點向量
 3 
 4 if k == 0       % 0次B樣條
 5     if (u >= NodeVector(i+1)) && (u < NodeVector(i+2))
 6         Nik_u = 1.0;
 7     else
 8         Nik_u = 0.0;
 9     end
10 else
11     Length1 = NodeVector(i+k+1) - NodeVector(i+1);
12     Length2 = NodeVector(i+k+2) - NodeVector(i+2);      % 支撐區間的長度
13     if Length1 == 0.0       % 規定0/0 = 0
14         Length1 = 1.0;
15     end
16     if Length2 == 0.0
17         Length2 = 1.0;
18     end
19     Nik_u = (u - NodeVector(i+1)) / Length1 * BaseFunction(i, k-1, u, NodeVector) ...
20         + (NodeVector(i+k+2) - u) / Length2 * BaseFunction(i+1, k-1, u, NodeVector);
21 end
Cox-deBoor遞推公式

所給程序可用於計算基函數Ni,k(u)的值,程序中對不同類型的B樣條曲線區別在於節點矢量 NodeVector 的取值不同。

 

1.2 B樣條曲線的分類

根據節點矢量中節點的分布情況不同,可以划分4中類型的B樣條曲線。不同類型的B樣條曲線區別主要在於節點矢量,對於具有n+1個控制頂點clip_image006[9] k B樣條曲線,無論是哪種類型都具有n+k+2個節點clip_image008[4]

clip_image010[4]

均勻B樣條曲線

節點矢量中節點為沿參數軸均勻或等距分布。

對應的節點矢量:clip_image012[4]

clip_image016[4]

 

准均勻B樣條曲線

其節點矢量中兩端節點具有重復度k+1,即u0=u1=...=ukun+1=un+2=...=un+k+1,所有的內節點均勻分布,具有重復度1

對應的節點矢量:clip_image018[4]

clip_image022[4]

 

分段Bezier曲線

其節點矢量中兩端節點的重復度與類型2相同,為k+1。不同的是內節點重復度為k。該類型有限制條件,控制頂點數減1必須等於次數的正整數倍,即必須滿足clip_image024[4] 正整數。

對應的節點矢量:clip_image026[4]

clip_image030[4]

 

一般非均勻B樣條曲線

對任意分布的節點矢量clip_image032[4],只要在數學上成立都可選取。

 

這里給出准均勻B樣條和分段Bezier曲線的生成節點矢量的代碼,均勻B樣條的很簡單就不列出了。假設共n+1個控制頂點,kB樣條,輸入參數為 n, k ,輸出節點矢量到NodeVector中。

 

 1 function NodeVector = U_quasi_uniform(n, k)
 2 % 准均勻B樣條的節點向量計算,共n+1個控制頂點,k次B樣條
 3 NodeVector = zeros(1, n+k+2);
 4 piecewise = n - k + 1;       % 曲線的段數
 5 if piecewise == 1       % 只有一段曲線時,n = k
 6     for i = n+2 : n+k+2
 7         NodeVector(1, i) = 1;
 8     end
 9 else
10     flag = 1;       % 不止一段曲線時
11     while flag ~= piecewise
12         NodeVector(1, k+1+flag) = NodeVector(1, k + flag) + 1/piecewise;
13         flag = flag + 1;
14     end
15     NodeVector(1, n+2 : n+k+2) = 1;
16 end
准均勻B樣條節點向量

 

 1 function NodeVector = U_piecewise_Bezier(n, k)
 2 % 分段Bezier曲線的節點向量計算,共n+1個控制頂點,k次B樣條
 3 % 分段Bezier端節點重復度為k+1,內間節點重復度為k,且滿足n/k為正整數
 4 
 5 if ~mod(n, k) && (~mod(k, 1) && k>=1)   % 滿足n是k的整數倍且k為正整數
 6     NodeVector = zeros(1, n+k+2);   % 節點矢量長度為n+k+2
 7     NodeVector(1, n+2 : n+k+2) = ones(1, k+1);  % 右端節點置1
 8     
 9     piecewise = n / k;      % 設定內節點的值
10     Flg = 0;
11     if piecewise > 1
12         for i = 2 : piecewise
13             for j = 1 : k
14                 NodeVector(1, k+1 + Flg*k+j) = (i-1)/piecewise;
15             end
16             Flg = Flg + 1;
17         end
18     end
19     
20 else
21     fprintf('error!\n');
22 end
分段Bezier曲線的節點向量

 

1.3 B樣條曲線的計算

根據B樣條曲線的定義公式(1),曲線上任一點坐標值是參數變量u的函數,用矩陣形式表示

clip_image034[4]     (3)

 

可以看出只要已知控制頂點坐標clip_image036[4]、曲線的次數clip_image038[4] 以及基函數clip_image040[4],就完全確定了B樣條曲線,其中基函數clip_image042[4]Cox-deBoor 公式(2)遞推計算。

 

2 B樣條曲面

2.1 B樣條曲面方程

確定一張clip_image044[6]次張量積B樣條曲面需要三個信息:

  •   給定clip_image046[4]個控制頂點clip_image048[4]構成控制網格
  •   給定參數clip_image050[4]clip_image052[4]的次數clip_image054[4]clip_image056[4]
  •       u向和v向的節點矢量clip_image058[4]clip_image060[4]

clip_image062[4]

定義的clip_image044[7]次張量積B樣條曲面其方程為:

clip_image064[4]

clip_image066[4]B樣條基clip_image068[4]clip_image070[4]分別由節點矢量clip_image072[4]clip_image074[4]Cox-deBoor遞推公式(2)計算。

B樣條曲面按照沿參數方向u, v所取的節點矢量不同,也可以划分成不同的類型:均勻、准均勻、分片Bezier和非均勻B樣條曲面。

2.2 B樣條曲面的計算

  給定曲面的控制頂點並確定次數后,還需要根據不同類型的B樣條曲面沿參數方向的節點矢量才能完全定義一張B樣條曲面。要計算B樣條曲面上的頂點坐標,首先沿一個參數方向如u向或v向,計算出該方向由控制頂點確定的B樣條曲線,如下圖中的紅色曲線是沿u向生成的二次均勻B樣條曲線,一共有四條。

clip_image076[4]

之后將沿u向計算得到的B樣條曲線上的點作為新的控制頂點,得到張量網格沿v向計算,得到的曲線就是B樣條曲面上的,下圖中綠色線段組成的就是沿v向的控制的頂點,藍顏色的曲線是沿v向的二次均勻B樣條曲線構成了一張二次均勻B樣條曲面。關於B樣條曲面實現的代碼這里可以下載。

clip_image078[4]clip_image080[4]clip_image082[4]

參考文獻:

[1] 施法中. 計算機輔助幾何設計與非均勻有理B樣條(修訂版)[M]. 北京: 高等教育出版社, 2013.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM