1 B樣條曲線
1.1 B樣條曲線方程
B樣條方法具有表示與設計自由型曲線曲面的強大功能,是形狀數學描述的主流方法之一,另外B樣條方法是目前工業產品幾何定義國際標准——有理B樣條方法 (NURBS)的基礎。B樣條方法兼備了Bezier方法的一切優點,包括幾何不變性,仿射不變性等等,同時克服了Bezier方法中由於整體表示帶來不具有局部性質的缺點(移動一個控制頂點將會影響整個曲線)。B樣條曲線方程可表示為
其中,di(i=0,1...n)為控制頂點(坐標),Ni,k(i=0,1...n)為k次規范B樣條基函數,最高次數是k。基函數是由一個稱為節點矢量的非遞減參數u的序列U:u0≤u1≤...≤un+k+1所決定的k次分段多項式。
B樣條的基函數通常采用Cox-deBoor遞推公式:
(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
所給程序可用於計算基函數Ni,k(u)的值,程序中對不同類型的B樣條曲線區別在於節點矢量 NodeVector 的取值不同。
1.2 B樣條曲線的分類
根據節點矢量中節點的分布情況不同,可以划分4中類型的B樣條曲線。不同類型的B樣條曲線區別主要在於節點矢量,對於具有n+1個控制頂點的 k 次B樣條曲線,無論是哪種類型都具有n+k+2個節點
。
均勻B樣條曲線
節點矢量中節點為沿參數軸均勻或等距分布。
准均勻B樣條曲線
其節點矢量中兩端節點具有重復度k+1,即u0=u1=...=uk,un+1=un+2=...=un+k+1,所有的內節點均勻分布,具有重復度1。
分段Bezier曲線
其節點矢量中兩端節點的重復度與類型2相同,為k+1。不同的是內節點重復度為k。該類型有限制條件,控制頂點數減1必須等於次數的正整數倍,即必須滿足 正整數。
一般非均勻B樣條曲線
這里給出准均勻B樣條和分段Bezier曲線的生成節點矢量的代碼,均勻B樣條的很簡單就不列出了。假設共n+1個控制頂點,k次B樣條,輸入參數為 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

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
1.3 B樣條曲線的計算
根據B樣條曲線的定義公式(1),曲線上任一點坐標值是參數變量u的函數,用矩陣形式表示
可以看出只要已知控制頂點坐標、曲線的次數
以及基函數
,就完全確定了B樣條曲線,其中基函數
由Cox-deBoor 公式(2)遞推計算。
2 B樣條曲面
2.1 B樣條曲面方程
,B樣條基
與
分別由節點矢量
和
按Cox-deBoor遞推公式(2)計算。
B樣條曲面按照沿參數方向u, v所取的節點矢量不同,也可以划分成不同的類型:均勻、准均勻、分片Bezier和非均勻B樣條曲面。
2.2 B樣條曲面的計算
給定曲面的控制頂點並確定次數后,還需要根據不同類型的B樣條曲面沿參數方向的節點矢量才能完全定義一張B樣條曲面。要計算B樣條曲面上的頂點坐標,首先沿一個參數方向如u向或v向,計算出該方向由控制頂點確定的B樣條曲線,如下圖中的紅色曲線是沿u向生成的二次均勻B樣條曲線,一共有四條。
之后將沿u向計算得到的B樣條曲線上的點作為新的控制頂點,得到張量網格沿v向計算,得到的曲線就是B樣條曲面上的,下圖中綠色線段組成的就是沿v向的控制的頂點,藍顏色的曲線是沿v向的二次均勻B樣條曲線構成了一張二次均勻B樣條曲面。關於B樣條曲面實現的代碼在這里可以下載。
參考文獻:
[1] 施法中. 計算機輔助幾何設計與非均勻有理B樣條(修訂版)[M]. 北京: 高等教育出版社, 2013.