B-スプライン曲線

は、与えられた複数の制御点とノットから定義される滑らかな曲線である。

区分多項式により表現されているため、一部を変更しても曲線全体に影響は及ばない等の性質がある。ベジェ曲線とともに、コンピュータグラフィックスの世界で広く利用されている。なお、B-splineはBasis spline（Basis＝基底）の省略形である。曲線は必ずしも制御点を通らない。

## 定義
パラメータ t \in \Bbb{R} 上に m 個の値 \{
t_j \in \Bbb{R}  
\ | \ 
t_j \leq t_{j+1}, \ j \in \{0, 1, ..., m-1 \}
\}
（ノット）をとり、次数を n \in \Bbb{N} とする。

制御点を \mathbf{P}_{i}, \ 0 \leq i \leq m-n-2  とすると、n 次の B-スプライン曲線 \mathbf{S}(t) は以下で定義される：
:\mathbf{S}(t)= \sum_{i=0}^{m-n-2} \mathbf{P}_{i} b_{i,n}(t)\ \text{,}\qquad t \in [t_n,t_{m-n-1}].
このとき b_{i,n}(t) は と呼ばれ、**de Boor Coxの漸化式** によって次のように定義される。
:b_{j,0}(t) := \left\{
\begin{matrix} 
1 & \text{if} \quad t_j \leq t 
:b_{j,k}(t) := \frac{t - t_j}{t_{j+k} - t_j} b_{j,k-1}(t) + \frac{t_{j+k+1} - t}{t_{j+k+1} - t_{j+1}} b_{j+1,k-1}(t)
,\qquad j=0,\ldots, m{-}k{-}2.

上の図は、n=2, m=8 の場合のノットベクトル、基底関数、制御点の関係を表したものである。基底関数の定義域（0ではない値をとる）は t の値により移動する三角形状の配列（traiangular array）となる。

### 重なりを含むノットベクトルへの対応
上記定義を実装し、重なり（同一ノットの反復）が含まれるノットベクトルを入力すると、t_{j+k} - t_j =0 または t_{j+k+1} - t_{j+1} =0 となることでゼロ除算エラーが発生する。
これらの場合、b_{j,k-1}(t) または b_{j+1,k-1}(t) は定義域外（=0）であり、存在しないとみなして問題ない。したがい、定義域外に関する項を無視する対処が必要である。

## ベジェ曲線との関係性
n次B-スプライン曲線は、以下のように制限するとn次ベジェ曲線と同一の式になる。つまりベジェ曲線はB-スプライン曲線の特殊な場合である。
* 制御点の数は n + 1 個。よってノットの数は m= 2(n + 1) 個。
* t が 0 から 1 まで変化するとし、ノットは t_j = 0\ \mbox{for}\ j \le n および t_j = 1\ \mbox{for}\ j > n 。 

## ノット
B-スプラインにおける**ノット**（）はパラメータ t の値であって、セグメントの区切りを定めるものである。

ノットの範囲は t_0 = 0, t_{m-1} = 1 とすることが多い。

### ノットベクトル
**ノットベクトル**（）は昇順に並べられたノットの列である。

ノットベクトルはいくつかの種類にわけられる。以下はその一例である：

* 一様ノットベクトル
* 開一様ノットベクトル
* 非一様ノットベクトル

#### 一様ノットベクトル
はノットが等間隔に配置されたノットベクトルである。
m 個のノットからなる一様ノットベクトルは j 番目の要素 t_j, \ j \in \{0, ..., m-1\}     が以下のように定義される：
: t_j = t_0 + \frac{t_{m-1} - t_0}{m - 1} j
言い換えれば、要素が等差数列状に並んでいるノットベクトルが一様ノットベクトルである。
例として、n=3, m=9 の一様ノットベクトル  \begin{bmatrix} 0\ 1\ 2\ 3\ 4\ 5\ 6\ 7\ 8 \end{bmatrix} についての基底関数と曲線は以下の図のようになる。

#### 開一様ノットベクトル
はベクトルの両端がそれぞれB-スプラインの次数だけ重複しているノットベクトルである。とも。
開一様ノットベクトルは次の手順で作られる：
* 最初の n + 1 個は 0 とする。
* 最後の n + 1 個は 1 とする。
* 残りの m - 2 (n + 1) 個は 0 より大きく 1 より小さい値で均等間隔で埋める。
例えば、n = 2, m = 7 の場合は制御点は4個でノットベクトルは [0\ 0\ 0\ 0.5\ 1\ 1\ 1] である。このノットベクトルの作り方では、曲線の端点は最初と最後の制御点になる。また、制御点の数が n + 1 個の場合はn次ベジェ曲線と同一になる。
例として、n=3, m=9 の開一様ノットベクトル  \begin{bmatrix} 3\ 3\ 3\ 3\ 4\ 5\ 5\ 5\ 5 \end{bmatrix} についての基底関数と曲線は以下の図のようになる。

#### 非一様ノットベクトル
はノットが不規則に配置されたノットベクトルである。

### ノットベクトルの性質
* ノット数が2(n+1)より多い場合、ノットベクトルを分割できる。例として、n=2 で \begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 & 6 \end{bmatrix} のノットベクトルは、\begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 \end{bmatrix} と \begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 \end{bmatrix} に分割できる。
* ノットベクトル全体に同一の値を加えたり乗じたりできる。この性質を利用して、t の値域を任意に変更できる。例として n=2 でノットベクトルが \begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 \end{bmatrix} の場合、t の値域は 2 \leq t  だが、\begin{bmatrix} -2 & -1 & 0 & 1 & 2 & 3 \end{bmatrix} とすれば t の値域は 0 \leq t  になる。
* 先頭と末尾のノットの値は任意。（基底関数に影響しない）

## 制御点と曲線

### 両端がクランプされた（clamped または 開一様/open）B-スプライン曲線
基本的に曲線は制御点を通らないが、例えば
:t_0=t_1=t_2=0
のように連続した複数のノットに対し、同一の値を与えることで、対応する制御点に曲線を通すことができる。
2次B-スプライン曲線の場合、以下のようになり、曲線の始点が0番目の制御点と一致する。
:\mathbf{S}(0)= \mathbf{P}_{0}.

ノットベクトルの最初の n + 1 個と、最後の n + 1 個を同一にすることで、曲線の端点は最初と最後の制御点になり、固定（clamped）される。

### 閉じた（closed または periodic）B-スプライン曲線
制御点を循環して用いることにより、閉じたB-スプライン曲線を表現することができる。以下の図は n=3 の閉じたB-スプラインの例である。

## 一様B-スプライン曲線
一様ノットベクトルで定義されるB-スプライン曲線を一様（uniform）B-スプライン曲線と呼ぶ。

### 行列形式

#### 一様2次B-スプライン曲線
一様なノットにおける2次B-スプライン曲線において、B-スプライン基底関数は次のようになる。
:b_{j,2}(t) = \begin{cases} \frac{1}{2}t^2 \\ -t^2 + t + \frac{1}{2} \\ \frac{1}{2}(1-t)^2   \end{cases}
これを行列形式にすると、
: \mathbf{S}_i(t) = \begin{bmatrix} t^2 & t & 1 \end{bmatrix} \frac{1}{2} \begin{bmatrix}
1 & -2 & 1 \\
-2 &  2 & 0 \\
1 &  1 & 0 \end{bmatrix}
\begin{bmatrix} \mathbf{p}_{i-1} \\ \mathbf{p}_{i} \\ \mathbf{p}_{i+1} \end{bmatrix}
 for t \in [0,1], i = 1,2 \ldots m-2
となる。

#### 3次B-スプライン曲線
行列形式は次のようになる。
: \mathbf{S}_i(t) = \begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix}
\mathbf{R}_i
\begin{bmatrix} \mathbf{p}_{i} \\ \mathbf{p}_{i+1} \\ \mathbf{p}_{i+2} \\ \mathbf{p}_{i+3} \end{bmatrix}
,\qquad t \in [0,1]

\mathbf{R}_iは係数行列。

#### 一様3次B-スプライン曲線の係数行列
:\mathbf{R}_i=
\frac{1}{6} \begin{bmatrix}
-1 & 3 & -3 & 1 \\
3 & -6 & 3 & 0 \\
-3 & 0 & 3 & 0 \\
1 & 4 & 1 & 0 \end{bmatrix}


#### 開一様3次B-スプライン曲線の係数行列
制御点の数をMとする。4 \leq M \leq 6 の場合、\mathbf{R}_iは次のようになる。

M \geq 7 の場合、\mathbf{R}_iは次のようになる。

### ベジェ曲線への変換
2次ベジェ曲線の行列形式は
:
\mathbf{P}(t)=
\begin{bmatrix}
t^2 & t & 1
\end{bmatrix}
\begin{bmatrix}
1 & -2 & 1 \\
-2 & 2 & 0 \\
1 & 0 & 0
\end{bmatrix}
\begin{bmatrix}
{\mathbf{p_{bz}}}_0 \\
{\mathbf{p_{bz}}}_1 \\
{\mathbf{p_{bz}}}_2
\end{bmatrix}
=
\begin{bmatrix}
t^2 & t & 1
\end{bmatrix}
\mathbf{R_{bz}}
\begin{bmatrix}
{\mathbf{p_{bz}}}_0 \\
{\mathbf{p_{bz}}}_1 \\
{\mathbf{p_{bz}}}_2
\end{bmatrix}


であることから、一様2次B-スプライン曲線と等しくなるベジェ曲線の制御点は
:
\begin{bmatrix}
{\mathbf{p_{bz}}}_0 \\
{\mathbf{p_{bz}}}_1 \\
{\mathbf{p_{bz}}}_2
\end{bmatrix}
=
\mathbf{R_{bz}}^{-1}
\mathbf{R}_i
\begin{bmatrix}
\mathbf{p}_{i-1} \\
\mathbf{p}_{i} \\
\mathbf{p}_{i+1}
\end{bmatrix}
=
\frac{1}{2}
\begin{bmatrix}
1 & 1 & 0 \\
0 & 2 & 0 \\
0 & 1 & 1
\end{bmatrix}
\begin{bmatrix}
\mathbf{p}_{i-1} \\
\mathbf{p}_{i} \\
\mathbf{p}_{i+1}
\end{bmatrix}


である。
3次ベジェ曲線の行列形式は
:
\mathbf{P}(t)=
\begin{bmatrix}
t^3 & t^2 & t & 1
\end{bmatrix}
\begin{bmatrix}
-1 & 3 & -3 & 1 \\
3 & -6 & 3 & 0 \\
-3 & 3 & 0 & 0 \\
1 & 0 & 0 & 0
\end{bmatrix}
\begin{bmatrix}
{\mathbf{p_{bz}}}_0 \\
{\mathbf{p_{bz}}}_1 \\
{\mathbf{p_{bz}}}_2 \\
{\mathbf{p_{bz}}}_3
\end{bmatrix}
=
\begin{bmatrix}
t^3 & t^2 & t & 1
\end{bmatrix}
\mathbf{R_{bz}}
\begin{bmatrix}
{\mathbf{p_{bz}}}_0 \\
{\mathbf{p_{bz}}}_1 \\
{\mathbf{p_{bz}}}_2 \\
{\mathbf{p_{bz}}}_3
\end{bmatrix}


であることから、一様3次B-スプライン曲線と等しくなるベジェ曲線の制御点は
:
\begin{bmatrix}
{\mathbf{p_{bz}}}_0 \\
{\mathbf{p_{bz}}}_1 \\
{\mathbf{p_{bz}}}_2 \\
{\mathbf{p_{bz}}}_3
\end{bmatrix}
=
\mathbf{R_{bz}}^{-1}
\mathbf{R}_i
\begin{bmatrix}
\mathbf{p}_{i} \\
\mathbf{p}_{i+1} \\
\mathbf{p}_{i+2} \\
\mathbf{p}_{i+3}
\end{bmatrix}
=
\frac{1}{6}
\begin{bmatrix}
1 & 4 & 1 & 0 \\
0 & 4 & 2 & 0 \\
0 & 2 & 4 & 0 \\
0 & 1 & 4 & 1
\end{bmatrix}
\begin{bmatrix}
\mathbf{p}_{i} \\
\mathbf{p}_{i+1} \\
\mathbf{p}_{i+2} \\
\mathbf{p}_{i+3}
\end{bmatrix}


である。
両者とも \mathbf{R_{bz}}^{-1} \mathbf{R}_i が制御点変換行列である。

以下は一様3次B-スプライン曲線の制御点（青色）をベジェ曲線の制御点（赤色）へ変換した例である。

開一様3次B-スプライン曲線の制御点変換行列 
\mathbf{R_{bz}}^{-1}
\mathbf{R}_i

は 4 \leq M \leq 6 の場合、以下のとおり。

M \geq 7 の場合、以下のとおり。

### 連続性
ノットベクトルの途中に重なりが含まれない場合、n次のB-スプライン曲線は(n-1)回微分可能である。
したがい、一様2次B-スプライン曲線はC1連続、一様3次B-スプライン曲線はC2連続である。
開一様B-スプライン曲線は、ノットベクトルに重なりが含まれるが、重なりがノットベクトルの途中ではなく端にあるため、同様である。

あるいは、カーブセグメント単位で連続性を求めることもできる。以下は3次B-スプライン曲線の連続性を求めた例である。
* カーブセグメントは t の3次関数で2回微分可能であり、C2連続である。
* カーブセグメント間の連続性は、以下の通りセグメントの終点と次のセグメントの始点の基底関数を比較することで求める；
:
\begin{array}{l}
\mathbf{S}_i(t) =
\begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix}
{\mathbf{R}}_i {\mathbf{P}}_i =
\begin{bmatrix} b_{i_{0,3}}(t) & b_{i_{1,3}}(t) &b_{i_{2,3}}(t) &b_{i_{3,3}}(t) \end{bmatrix}
\begin{bmatrix}
{\mathbf{p}}_i \\
{\mathbf{p}}_{i+1} \\
{\mathbf{p}}_{i+2} \\
{\mathbf{p}}_{i+3}
\end{bmatrix}
\\
\mathbf{S}_{i+1}(t) =
\begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix}
{\mathbf{R}}_{i+1} {\mathbf{P}}_{i+1} =
\begin{bmatrix} b_(t) & b_(t) &b_(t) &b_(t) \end{bmatrix}
\begin{bmatrix}
{\mathbf{p}}_{i+1} \\
{\mathbf{p}}_{i+2} \\
{\mathbf{p}}_{i+3} \\
{\mathbf{p}}_{i+4}
\end{bmatrix}
\end{array}

なので、
:
\begin{array}{l}
b_{i_{0,3}}(1)=b_(0)=0 \\
b_{i_{1,3}}(1)=b_(0) \\
b_{i_{2,3}}(1)=b_(0) \\
b_{i_{3,3}}(1)=b_(0) \\
\end{array}

であれば \mathbf{S}_i(1)=\mathbf{S}_{i+1}(0) であり、C0連続を判定できる。
同様に、1次微分、2次微分についてC1連続、C2連続を判定できる。

一様3次B-スプライン曲線の場合、
:
\begin{array}{l}
\begin{bmatrix} b_{i_{0,3}}(1) & b_{i_{1,3}}(1) &b_{i_{2,3}}(1) &b_{i_{3,3}}(1) \end{bmatrix}
= 
\frac{1}{6}\begin{bmatrix} 0 & 1 & 4 & 1 \end{bmatrix}
\\
\begin{bmatrix} b_(0) & b_(0) &b_(0) &b_(0) \end{bmatrix}
=
\frac{1}{6}\begin{bmatrix} 1 & 4 & 1 & 0 \end{bmatrix}
\end{array}

である。1次微分については
:
\begin{array}{l}
\begin{bmatrix} b'_{i_{0,3}}(1) & b'_{i_{1,3}}(1) &b'_{i_{2,3}}(1) &b'_{i_{3,3}}(1) \end{bmatrix}
=
\frac{1}{2}\begin{bmatrix} 0 & -1 & 0 & 1 \end{bmatrix}
\\
\begin{bmatrix} b'_(0) & b'_(0) &b'_(0) &b'_(0) \end{bmatrix}
= 
\frac{1}{2}\begin{bmatrix} -1 & 0 & 1 & 0 \end{bmatrix}
\end{array}

である。2次微分については
:
\begin{array}{l}
\begin{bmatrix} b*_{i_{0,3}}(1) & b*_{i_{1,3}}(1) &b*_{i_{2,3}}(1) &b*_{i_{3,3}}(1) \end{bmatrix}
= 
\begin{bmatrix} 0 & 1 & -2 & 1 \end{bmatrix}
\\
\begin{bmatrix} b*_(0) & b*_(0) &b*_(0) &b*_(0) \end{bmatrix}
=
\begin{bmatrix} 1 & -2 & 1 & 0 \end{bmatrix}
\end{array}

である。したがい、一様3次B-スプライン曲線はC2連続である。

開一様3次B-スプライン曲線の場合；

したがい、C0連続以上である。1次微分については

したがい、C1連続以上である。2次微分については

したがい、開一様3次B-スプライン曲線はC2連続である。

### 面積
パラメトリック関数で表される開いた曲線の面積は、ガウスグリーンの定理で求めることができる。
一様2次B-スプライン曲線の行列形式をあてはめると、曲線の始点と終点および原点で囲まれた領域の面積は次のようになる。

:
S_i=
\frac{1}{24}
\begin{bmatrix}
{p_{i-1}}_x & {p_{i}}_x & {p_{i+1}}_x
\end{bmatrix}
\begin{bmatrix}
0 & 5 & 1 \\
-5 & 0 & 5 \\
-1 & -5 & 0
\end{bmatrix}
\begin{bmatrix}
{p_{i-1}}_y \\
{p_{i}}_y \\
{p_{i+1}}_y
\end{bmatrix}


一様3次B-スプライン曲線の行列形式をあてはめると、曲線の始点と終点および原点で囲まれた領域の面積は次のようになる。

:
S_i=
\frac{1}{720}
\begin{bmatrix}
{p_i}_x & {p_{i+1}}_x & {p_{i+2}}_x & {p_{i+3}}_x
\end{bmatrix}
\begin{bmatrix}
0 & 31 & 28 & 1 \\
-31 & 0 & 183 & 28 \\
-28 & -183 & 0 & 31 \\
-1 & -28 & -31 & 0
\end{bmatrix}
\begin{bmatrix}
{p_i}_y \\
{p_{i+1}}_y \\
{p_{i+2}}_y \\
{p_{i+3}}_y
\end{bmatrix}


原点に対し制御点が反時計回りの並びの場合、面積は正の値、時計回りの並びの場合、面積は負の値になる。閉包を構成する各カーブセグメントの面積を合計することにより、閉包と原点の間の領域の面積がキャンセルされ、閉包のみの面積を求めることができる。

## 有理B-スプライン
有理B-スプラインは各制御点に重みを付けた物。詳細はNURBS（非一様有理B-スプライン）を参照。

## B-スプライン曲面
u 方向に n_u 次で v 方向に n_v 次の**B-スプライン曲面**（B-spline surface）は以下のように表される。
:\mathbf{S}(u, v)= \sum_{i_u=0}^{m_u-n_u-2} \sum_{i_v=0}^{m_v-n_v-2} \mathbf{P}_{i_u,i_v} b_{i_u,n_u}(u) b_{i_v,n_v}(v)\ \text{,}\qquad u \in [u_{n_u},u_{m_u-n_u-1}],\ v \in [v_{n_v}, v_{m_v-n_v-1}].
ノットや基底関数は曲線と同じ。制御点の個数は (m_u-n_u-1) (m_v-n_v-1) 個。

## 脚注

### 出典

## 参考文献

* 
* 
* 

## 関連項目
* スプライン曲線
* ベジェ曲線
* NURBS
* 切断冪関数

## 外部リンク
* Interactive java applets for B-splines
*