B样条

在數學的子學科數值分析裡，**B - 樣條**是樣條曲線一種特殊的表示形式。它是 B - 樣條基曲線的線性組合。B - 樣條是貝茲曲線的一種一般化，可以進一步推廣為非均勻有理 B 樣條（NURBS），使得我們能給更多一般的幾何體建造精確的模型。

De Boor 算法是一個數值上穩定的計算 B 樣條的方法。

術語 _B 樣條_是 Isaac Jacob Schoenberg 創造的，B 是基（basis）樣條的縮略。

## 定義

給定 _m_+1 個節點 _t_i ，分布在 [0,1] 區間，滿足

　
: $t_{0}<t_{1}<\ldots <t_{m}$

一個 _n_ 次 **B 樣條**是一個參數曲線：

　
: $\mathbf {S} :[0,1]\to \mathbb {R} ^{2}$

它由 _n_ 次 **B 樣條基 (basis B-spline)** 組成

　
: $\mathbf {S} (t)=\sum _{i=0}^{m}\mathbf {P} _{i}b_{i,n}(t){\mbox{ , }}t\in [0,1]$ .

**P**i 稱為**控制點**或 **de Boor 點**. 
_m_+1 個 _n_ 次 B 樣條基可以用 **Cox-de Boor 遞歸公式** 定義

　
: $b_{j,0}(t):=\left\{{\begin{matrix}1&\mathrm {} \quad t_{j}<t<t_{j+1}\\0&\mathrm {...} \end{matrix}}\right.$

　
: $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).$

當節點等距，稱 B 樣條為**均勻**(uniform) 否則為**非均勻**(non-uniform)。

### 均勻 B 樣條曲線

當 B 樣條是均勻的時候，對於給定的 _n_，每個 B 樣條基是其他基的平移拷貝而已。一個可以作為替代的非遞歸定義是

　
: $b_{j,n}(t):=b_{n}(t+n-j)\qquad {\mbox{ , }}j=-1,\ldots m+1$

滿足

　
: $b_{n}(t):=(m+1)\sum _{i=0}^{m+1}\omega _{i}(t_{i}-t)_{+}^{m}\qquad {\mbox{ , }}t\in [0,1]$

滿足

　
: $\omega _{i}:=\prod _{j=0,i\neq j}^{m+1}{\frac {1}{t_{i}-t_{k}}}$

其中

　
: $(t_{i}-t)_{+}$

是截斷冪函數（truncated power function）

## 註解

當節點數和多項式次數相等時，B 樣條退化為貝茲曲線。即函數的形狀由節點的位置決定。縮放或者平移節點向量不會改變基函數。

樣條包含在它的控制點的凸包中

_n_ 次 B 樣條的一個基

　
: $b_{i,n}(t)$

僅當在區間 [_t_i, _t_i+n+1] 上非 0。就是

　
: $b_{i,n}(t)=\left\{{\begin{matrix}>0&\mathrm {} \quad t_{i}\leq t<t_{i+n+1}\\0&\mathrm {...} \end{matrix}}\right.$

換句話說，如果我們操作一個控制點，我們只改變曲線在局部的行為，而不像 Bezier 曲線那樣是全局行為。

## 例子

### 常數 B 樣條

常數 B 樣條是最簡單的樣條。只定義在一個節點距離上，而且不是節點的函數。它只是不同節點段（knot span）的指示函數。

　
: $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.$

### 線性 B 樣條

線性 B 樣條定義在兩個相鄰的節點段上，在節點連續但不可微。

　
: $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.$

### 三次 B 樣條

一個片斷上的 B 樣條的表達式可以寫作：

　
: $S_{i}(t)=\sum _{k=0}^{3}\mathbf {P} _{i-3+k}b_{i-3+k,3}(t)\qquad {\mbox{ , }}t\in [0,1]$

其中 **S**i 是第 _i_ 個 B 樣條片斷而 P 是一個控制點集，_i_ 和 _k_ 是局部控制點索引。控制點的集合會是 $P_{i}^{w}=(w_{i}x_{i},w_{i}y_{i},w_{i}z_{i},w_{i})$ 的集合，其中 $w_{i}$ 是比重，當它增加時曲線會被拉向控制點 $P_{i}$ ，在減小時則把曲線遠離該點。

 
片段的整個集合 _m_-2 條曲線（ $S_{3},S_{4},...,S_{m}$ ）由 _m_+1 個控制點（ $P_{0},P_{1},...,P_{m},m\geq 3$ ）定義，作為 _t_ 上的一個 B 樣條可以定義為

　
: $S(t)=\sum _{i=0}^{m}\mathbf {P} _{i}b_{i,}(t)$

其中 _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 樣條曲線及曲面相關算法

關於此處涉及的算法，在著作中有針對 Bézier、B 樣條（B-spline）以及非均勻有理 B 樣條（Nurbs）的相關算法的詳細數學表達和程序實現方法。

### 求導

在幾何處理中，對參數曲線及曲面的求導是最基本的運算之一，由於參數表達的特性，在給定點的切線及法線可通過求導直接得到。
先來考察曲線的情形：採用本頁定義中的 B 樣條曲線表達式 $\mathbf {S} (t)=\sum _{i=0}^{m}\mathbf {P} _{i}b_{i,n}(t){\mbox{ , }}t\in [0,1]$ 對參數 $t$ 進行求導： ${\frac {d\mathbf {S} }{dt}}=\sum _{i=0}^{m}b'_{i,n}(t)\mathbf {P} _{i}$

### 節點插入與刪除

### 曲線及曲面擬合

## 應用

## 參看

* 樣條
* De Boor 算法
* 非均勻有理 B 樣條

## 參考

本條目部分或全部內容出自以 GFDL 授權發佈的《自由線上電腦詞典》（FOLDOC）。

## 參考文獻

 

## 外部連結

* Interactive java applets for B-splines（頁面存檔備份，存於網際網路檔案館）
* Introduction to Computing with Geometry Notes (Dr.C.-K.Shene/Michigan Technological University)（頁面存檔備份，存於網際網路檔案館）