コンテンツにスキップ

B-スプライン曲線

出典: フリー百科事典『ウィキペディア(Wikipedia)』
B-スプライン曲線と制御点の例

B-スプライン曲線Bスプラインきょくせん: B-spline curve)は、与えられた複数の制御点とノットから定義される滑らかな曲線である。

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

定義

[編集]

パラメータ 上に 個の値 ノット)をとり、次数を とする。

制御点を とすると、 次の B-スプライン曲線 は以下で定義される:

.

このとき B-スプライン基底関数Bスプラインきていかんすう: B-spline basis function)と呼ばれ、de Boor Coxの漸化式 によって次のように定義される。

B-スプライン三角形配列
B-スプライン三角形配列

上の図は、 の場合のノットベクトル、基底関数、制御点の関係を表したものである。基底関数の定義域(ではない値をとる)は の値により移動する三角形状の配列(traiangular array)となる[1]

重なりを含むノットベクトルへの対応

[編集]

上記定義を実装し、重なり(同一ノットの反復)が含まれるノットベクトルを入力すると、 または となることでゼロ除算エラーが発生する[2]。 これらの場合、 または は定義域外()であり、存在しないとみなして問題ない。したがい、定義域外に関する項を無視する対処が必要である[3]

ベジェ曲線との関係性

[編集]

n次B-スプライン曲線は、以下のように制限するとn次ベジェ曲線と同一の式になる。つまりベジェ曲線はB-スプライン曲線の特殊な場合である。

  • 制御点の数は 個。よってノットの数は 個。
  • t が 0 から 1 まで変化するとし、ノットは および

ノット

[編集]

B-スプラインにおけるノット: knot)はパラメータ の値であって、セグメントの区切りを定めるものである[4]

ノットの範囲は とすることが多い[5]

ノットベクトル

[編集]

ノットベクトル: knot vector)は昇順に並べられたノットの列である[6][7]

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

一様ノットベクトル

[編集]

一様ノットベクトルいちようノットベクトル: uniform knot vector)はノットが等間隔に配置されたノットベクトルである[8][9] 個のノットからなる一様ノットベクトルは 番目の要素 が以下のように定義される[10]

言い換えれば、要素が等差数列状に並んでいるノットベクトルが一様ノットベクトルである[9]
例として、 の一様ノットベクトル についての基底関数と曲線は以下の図のようになる。

一様ノットベクトルに対する基底関数と曲線の例(n=3, m=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)
開一様ノットベクトルに対する基底関数と曲線の例(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-スプラインの例
closed B-スプラインの例

一様B-スプライン曲線

[編集]

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

行列形式

[編集]

一様2次B-スプライン曲線

[編集]

一様なノットにおける2次B-スプライン曲線において、B-スプライン基底関数は次のようになる。

これを行列形式にすると、

for

となる。

3次B-スプライン曲線

[編集]

行列形式は次のようになる。

は係数行列。

一様3次B-スプライン曲線の係数行列

[編集]

開一様3次B-スプライン曲線の係数行列

[編集]

制御点の数をとする。 の場合、は次のようになる。[16]

の場合、は次のようになる。[17]

ベジェ曲線への変換

[編集]

2次ベジェ曲線の行列形式は

であることから、一様2次B-スプライン曲線と等しくなるベジェ曲線の制御点は

である。
3次ベジェ曲線の行列形式は

であることから、一様3次B-スプライン曲線と等しくなるベジェ曲線の制御点は

である。
両者とも が制御点変換行列である。

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

ベジェ曲線への変換例
ベジェ曲線への変換例

開一様3次B-スプライン曲線の制御点変換行列 の場合、以下のとおり。[16]

の場合、以下のとおり。

連続性

[編集]

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

あるいは、カーブセグメント単位で連続性を求めることもできる。以下は3次B-スプライン曲線の連続性を求めた例である。[16]

  • カーブセグメントは の3次関数で2回微分可能であり、C2連続である。
  • カーブセグメント間の連続性は、以下の通りセグメントの終点と次のセグメントの始点の基底関数を比較することで求める;

なので、

であれば であり、C0連続を判定できる。
同様に、1次微分、2次微分についてC1連続、C2連続を判定できる。

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

である。1次微分については

である。2次微分については

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

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

判定

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

判定

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

判定

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

面積

[編集]

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

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

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

有理B-スプライン

[編集]

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

B-スプライン曲面

[編集]

方向に 次で 方向に 次のB-スプライン曲面(B-spline surface)は以下のように表される[20]

.

ノットや基底関数は曲線と同じ。制御点の個数は 個。

脚注

[編集]

出典

[編集]
  1. ^ de Boor, p. 132
  2. ^ 実装例のFortran副プログラムBSPLVBのコメントに "DIVISION BY ZERO WILL RESULT IF T(LEFT)=T(LEFT+1)" と記載されている。 de Boor, p. 134
  3. ^ Fussy - B-スプライン曲線
  4. ^ "セグメントの区切りとなるパラメータの値を定義した数値(ノット)" 三谷 2020 より引用。
  5. ^ B-spline Basis Functions: Definition - CS3621 Introduction to Computing with Geometry Notes
  6. ^ "ノットベクトル ... ノット ... の列" 三谷 2020 より引用。
  7. ^ "Bスプラインの形を決めるもの ... ノット列の値は単純増加" 三谷 2020 より引用。
  8. ^ "ノットベクトル ti が一定の間隔で存在する → 一様" 三谷 2020 より引用。
  9. ^ a b "ノットベクトルには、次の3つの型がある。... ノットベクトルが等差数列になっている場合の一様なノットベクトル(uniform knot vector)" 谷口 2000, p. 241 より引用。
  10. ^ a b B-splines - Advanced Graphics and HCI
  11. ^ "ノットベクトルには、次の3つの型がある。...ノットベクトルが両端で階数だけ重複している場合の開一様ノットベクトル(open uniform)" 三谷 2020 より引用。
  12. ^ a b Knot Vector Generation - CS3621 Introduction to Computing with Geometry Notes
  13. ^ Knot Vector Generation for B-Spline Interpolation - Wolfram Demonstrations Project
  14. ^ "ノットベクトルには、次の3つの型がある。...非一様ノットベクトル(non-uniform knot vector)" 谷口 2000, p. 241 より引用。
  15. ^ "ノットベクトル ... ノットの間隔を変更すると「非一様」になる" 三谷 2020 より引用。
  16. ^ a b c 実装技術者向けB-スプライン曲線入門”. Qiita. 2025年11月10日閲覧。
  17. ^ Cohen, Elaine; Riesenfeld, Richard F. (1982). “General Matrix Representations for Bezier and B-spline Curves”. Computers in Industry 3: 13-15. 
  18. ^ de Boor, p. 138.
  19. ^ 高校数学の美しい物語 - ガウスグリーンの定理の入試への応用
  20. ^ B-spline Surfaces: Construction - CS3621 Introduction to Computing with Geometry Notes

参考文献

[編集]
  • 三谷「第6回 曲線・曲面の表現「Bスプライン曲線」」『筑波大学講義 コンピュータグラフィックス基礎』2020年https://mitani.cs.tsukuba.ac.jp/lecture/2020/cg_basics/06/06_slides.pdf 
  • 谷口, 道興 (2000). “制御点方式による曲線形状の生成”. 長野大学紀要 22 (3): 234-242. 
  • de Boor, Carl (1978). A Practical Guide to Spline. ISBN 0-387-90356-9 

関連項目

[編集]

外部リンク

[編集]