B-スプライン曲線(、英: B-spline curve)は、与えられた複数の制御点とノットから定義される滑らかな曲線である。
B-スプライン曲線と制御点の例
区分多項式により表現されているため、一部を変更しても曲線全体に影響は及ばない等の性質がある。ベジェ曲線とともに、コンピュータグラフィックスの世界で広く利用されている。なお、B-splineはBasis spline(Basis=基底)の省略形である。曲線は必ずしも制御点を通らない。
パラメータ 上に 個の値 (ノット)をとり、次数を とする。
制御点を とすると、 次の B-スプライン曲線 は以下で定義される:
- .
このとき は B-スプライン基底関数(、英: B-spline basis function)と呼ばれ、de Boor Coxの漸化式 によって次のように定義される。
-
-
B-スプライン三角形配列
上の図は、 の場合のノットベクトル、基底関数、制御点の関係を表したものである。基底関数の定義域( ではない値をとる)は の値により移動する三角形状の配列(traiangular array)となる[1]。
上記定義を実装し、重なり(同一ノットの反復)が含まれるノットベクトルを入力すると、 または となることでゼロ除算エラーが発生する[2]。
これらの場合、 または は定義域外( )であり、存在しないとみなして問題ない。したがい、定義域外に関する項を無視する対処が必要である[3]。
B-スプラインにおけるノット(英: knot)はパラメータ の値であって、セグメントの区切りを定めるものである[4]。
ノットの範囲は とすることが多い[5]。
ノットベクトル(英: knot vector)は昇順に並べられたノットの列である[6][7]。
ノットベクトルはいくつかの種類にわけられる。以下はその一例である:
一様ノットベクトル(、英: uniform knot vector)はノットが等間隔に配置されたノットベクトルである[8][9]。
個のノットからなる一様ノットベクトルは 番目の要素 が以下のように定義される[10]:
-
言い換えれば、要素が等差数列状に並んでいるノットベクトルが一様ノットベクトルである[9]。
例として、 の一様ノットベクトル についての基底関数と曲線は以下の図のようになる。
一様ノットベクトルに対する基底関数と曲線の例(n=3, m=9)
開一様ノットベクトル(、英: open uniform knot vector)はベクトルの両端がそれぞれB-スプラインの次数だけ重複しているノットベクトルである[11][10]。一様間隔ノットベクトル(、英: uniformly-spaced knot vector)とも[12][13]。
開一様ノットベクトルは次の手順で作られる:
- 最初の 個は 0 とする。
- 最後の 個は 1 とする。
- 残りの 個は 0 より大きく 1 より小さい値で均等間隔で埋める。
例えば、n = 2, m = 7 の場合は制御点は4個でノットベクトルは である。このノットベクトルの作り方では、曲線の端点は最初と最後の制御点になる。また、制御点の数が 個の場合はn次ベジェ曲線と同一になる。
例として、 の開一様ノットベクトル についての基底関数と曲線は以下の図のようになる。
開一様ノットベクトルに対する基底関数と曲線の例(n=3, m=9)
非一様ノットベクトル(、英: non-uniform knot vector)はノットが不規則に配置されたノットベクトルである[14][15]。
- ノット数が より多い場合、ノットベクトルを分割できる。
例として、 で のノットベクトルは、 と に分割できる。
- ノットベクトル全体に同一の値を加えたり乗じたりできる。この性質を利用して、 の値域を任意に変更できる。
例として でノットベクトルが の場合、 の値域は だが、 とすれば の値域は になる。
- 先頭と末尾のノットの値は任意。(基底関数に影響しない)
両端がクランプされた(clamped または 開一様/open)B-スプライン曲線
編集
基本的に曲線は制御点を通らないが、例えば
-
のように連続した複数のノットに対し、同一の値を与えることで、対応する制御点に曲線を通すことができる。
2次B-スプライン曲線の場合、以下のようになり、曲線の始点が0番目の制御点と一致する。
- .
ノットベクトルの最初の n + 1 個と、最後の n + 1 個を同一にすることで、曲線の端点は最初と最後の制御点になり、固定(clamped)される[12]。
閉じた(closed または periodic)B-スプライン曲線
編集
制御点を循環して用いることにより、閉じたB-スプライン曲線を表現することができる。以下の図は の閉じたB-スプラインの例である。
closed B-スプラインの例
一様ノットベクトルで定義されるB-スプライン曲線を一様(uniform)B-スプライン曲線と呼ぶ。
一様なノットにおける2次B-スプライン曲線において、B-スプライン基底関数は次のようになる。
-
これを行列形式にすると、
- for
となる。
行列形式は次のようになる。
-
は係数行列。
-
制御点の数を とする。 の場合、 は次のようになる。
|
|
|
|
|
|
|
|
|
|
2次ベジェ曲線の行列形式は
-
であることから、一様2次B-スプライン曲線と等しくなるベジェ曲線の制御点は
-
である。
3次ベジェ曲線の行列形式は
-
であることから、一様3次B-スプライン曲線と等しくなるベジェ曲線の制御点は
-
である。
両者とも が制御点変換行列である。
以下は一様3次B-スプライン曲線の制御点(青色)をベジェ曲線の制御点(赤色)へ変換した例である。
ベジェ曲線への変換例
開一様3次B-スプライン曲線の制御点変換行列
は の場合、以下のとおり。
|
|
|
|
|
|
|
|
|
|
ノットベクトルの途中に重なりが含まれない場合、n次のB-スプライン曲線は 回微分可能である[17]。
したがい、一様2次B-スプライン曲線はC1連続、一様3次B-スプライン曲線はC2連続である。
パラメトリック関数で表される開いた曲線の面積は、ガウスグリーンの定理で求めることができる[18]。
一様2次B-スプライン曲線の行列形式をあてはめると、曲線の始点と終点および原点で囲まれた領域の面積は次のようになる。
-
一様3次B-スプライン曲線の行列形式をあてはめると、曲線の始点と終点および原点で囲まれた領域の面積は次のようになる。
-
原点に対し制御点が反時計回りの並びの場合、面積は正の値、時計回りの並びの場合、面積は負の値になる。閉包を構成する各カーブセグメントの面積を合計することにより、閉包と原点の間の領域の面積がキャンセルされ、閉包のみの面積を求めることができる。
有理B-スプラインは各制御点に重みを付けた物。詳細はNURBS(非一様有理B-スプライン)を参照。
方向に 次で 方向に 次のB-スプライン曲面(B-spline surface)は以下のように表される[19]。
- .
ノットや基底関数は曲線と同じ。制御点の個数は 個。