在數學的子學科數值分析裏,B-樣條是樣條曲線一種特殊的表示形式。它是B-樣條基曲線的線性組合。B-樣條是貝茲曲線的一種一般化,可以進一步推廣為非均勻有理B樣條(NURBS),使得我們能給更多一般的幾何體建造精確的模型。
De Boor算法是一個數值上穩定的計算B樣條的方法。
術語 B樣條是Isaac Jacob Schoenberg創造的,B 是基(basis)樣條的縮略。
給定m+1 個節點ti ,分佈在[0,1]區間,滿足
![{\displaystyle t_{0}<t_{1}<\ldots <t_{m}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/09b15dc110e4392578a34e948e8e248f4a871204)
一個n次B樣條是一個參數曲線:
![{\displaystyle \mathbf {S} :[0,1]\to \mathbb {R} ^{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3a1917bdabba80d2cee8eb2ebf83a2e9a175c74)
它由n次B樣條基(basis B-spline)組成
.
Pi稱為控制點或de Boor點.
m+1個n次B樣條基可以用Cox-de Boor遞歸公式 定義
![{\displaystyle b_{j,0}(t):=\left\{{\begin{matrix}1&\mathrm {} \quad t_{j}<t<t_{j+1}\\0&\mathrm {...} \end{matrix}}\right.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ab74fd18a4ffbc3beb90681a8425bb7b56bc3182)
![{\displaystyle b_{j,n}(t):={\frac {t-t_{j}}{t_{j+n}-t_{j}}}b_{j,n-1}(t)+{\frac {t_{j+n+1}-t}{t_{j+n+1}-t_{j+1}}}b_{j+1,n-1}(t).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d75ff1689c55d022d667389b940ade9c0494c934)
當節點等距,稱B樣條為均勻(uniform)否則為非均勻(non-uniform)。
均勻B樣條曲線[編輯]
當B樣條是均勻的時候,對於給定的n,每個B樣條基是其他基的平移拷貝而已。一個可以作為替代的非遞歸定義是
![{\displaystyle b_{j,n}(t):=b_{n}(t+n-j)\qquad {\mbox{ , }}j=-1,\ldots m+1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7ecf8c851254a79b445c2db9f397871e6aadd07b)
滿足
![{\displaystyle b_{n}(t):=(m+1)\sum _{i=0}^{m+1}\omega _{i}(t_{i}-t)_{+}^{m}\qquad {\mbox{ , }}t\in [0,1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/cf66cfc86995c9dd2e6714da9741b2b1f80630a9)
滿足
![{\displaystyle \omega _{i}:=\prod _{j=0,i\neq j}^{m+1}{\frac {1}{t_{i}-t_{k}}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ddfdb42cd68ab97be56b7cb4d90464c4c2716c38)
其中
![{\displaystyle (t_{i}-t)_{+}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/da8d84ae23dbf982a0f5567dbc98031bad963cbc)
是截斷冪函數(truncated power function)
當節點數和多項式次數相等時,B樣條退化為貝茲曲線。即函數的形狀由節點的位置決定。縮放或者平移節點向量不會改變基函數。
樣條包含在它的控制點的凸包中
n次B樣條的一個基
![{\displaystyle b_{i,n}(t)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0b715352c68475bf95790a6bb15eb4c271ead958)
僅當在區間[ti, ti+n+1]上非0。就是
![{\displaystyle b_{i,n}(t)=\left\{{\begin{matrix}>0&\mathrm {} \quad t_{i}\leq t<t_{i+n+1}\\0&\mathrm {...} \end{matrix}}\right.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c917a9ab223064ab17bea997b397fa51cb4640fe)
換句話說,如果我們操作一個控制點,我們只改變曲線在局部的行為,而不像Bezier曲線那樣是全局行為。
常數B樣條[編輯]
常數B樣條是最簡單的樣條。只定義在一個節點距離上,而且不是節點的函數。它只是不同節點段(knot span)的指示函數。
![{\displaystyle b_{j,0}(t)=1_{[t_{j},t_{j+1})}=\left\{{\begin{matrix}1&\mathrm {} \quad t_{j}\leq t<t_{j+1}\\0&\mathrm {...} \end{matrix}}\right.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/29859cbeb1c40eca0b6c82b3e1a6eaa0d94dd5dd)
線性B樣條[編輯]
線性B樣條定義在兩個相鄰的節點段上,在節點連續但不可微。
![{\displaystyle b_{j,1}(t)=\left\{{\begin{matrix}{\frac {t-t_{j}}{t_{j+1}-t_{j}}}&\mathrm {if} \quad t_{j}\leq t<t_{j+1}\\{\frac {t_{j+2}-t}{t_{j+2}-t_{j+1}}}&\mathrm {} \quad t_{j+1}\leq t<t_{j+2}\\0&\mathrm {...} \end{matrix}}\right.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a321b719e75aaef513e908d1d8b47e9e6770be91)
三次B樣條[編輯]
一個片斷上的B樣條的表達式可以寫作:
![{\displaystyle S_{i}(t)=\sum _{k=0}^{3}\mathbf {P} _{i-3+k}b_{i-3+k,3}(t)\qquad {\mbox{ , }}t\in [0,1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/20bcddc5acb91dc14d5e522db1c3b3e28204713a)
其中Si是第i個B樣條片斷而P是一個控制點集,i和k是局部控制點索引。控制點的集合會是
的集合,其中
是比重,當它增加時曲線會被拉向控制點
,在減小時則把曲線遠離該點。
片段的整個集合m-2條曲線(
)由m+1個控制點(
)定義,作為t上的一個B樣條可以定義為
![{\displaystyle S(t)=\sum _{i=0}^{m}\mathbf {P} _{i}b_{i,}(t)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f8d9f8e431eba6d37f8ee3979451e5331926502b)
其中i是控制點數,t是取節點值的全局參數。這個表達式把B樣條表示為B樣條基函數的線性組合,這也是這個名稱的原因。
有兩類B樣條-均勻和非均勻。非均勻B樣條相鄰控制點間的距離不一定要相等。一個一般的形式是區間隨着插入控制點逐步變小到0。
B樣條的程式指令[編輯]
Matlab[編輯]
In Matlab,the command「spline」 can be used for spline interpolation.
(Note: In the command, the cubic B-spline is used)
Cubic B-Spline Interpolation by Matlab
Generating a sine-like spline curve and samples it over a finer mesh:
x = 0:1:10; % original sampling points
y = sin(x);
xx = 0:0.1:10; % new sampling points
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)
Python[編輯]
事前安裝模組
- pip install numpy
- pip install scipy
- pip install matplotlib
Cubic B-Spline Interpolation by Python
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 11) # original sample points, [0, 1, 2, …, 9, 10]
y = np.sin(x)
f = interp1d(x, y, kind=' cubic ') ) # Cubic means the cubic B-spline.
x_new = np.arange(0, 10.1, 0.1) # new sample points, [0, 0.1, 0.2, ….., 9.9, 10]
y_new = f(x_new)
plt.plot(x,y,'o',x_new, y_new)
plt.show()
B樣條曲面[編輯]
B樣條曲線及曲面相關算法[編輯]
關於此處涉及的算法,在著作[1]中有針對Bézier、B樣條(B-spline)以及非均勻有理B樣條(Nurbs)的相關算法的詳細數學表達和程序實現方法。
在幾何處理中,對參數曲線及曲面的求導是最基本的運算之一,由於參數表達的特性,在給定點的切線及法線可通過求導直接得到。
先來考察曲線的情形:採用本頁定義中的B樣條曲線表達式
對參數
進行求導:
節點插入與刪除[編輯]
曲線及曲面擬合[編輯]
本條目部分或全部內容出自以GFDL授權發佈的《自由線上電腦詞典》(FOLDOC)。
- ^ Les Piegl and Wayne Tiller: The NURBS Book, Springer-Verlag 1995-1997 (2nd ed).
參考文獻[編輯]
- Jian-Jiun Ding, 「Time Frequency Analysis and Wavelet Transforms 」, NTU, 2021.
外部連結[編輯]