上で説明したように,制御点列の始めから終わりまでを高次のベジエ曲線で表すと,凹凸の激しい部分が 滑らかになってしまう,制御点の1つを動かすと曲線全体が変わってしまうなどの性質がある.凹凸に対 する問題を解決するには,凹凸の部分で制御点を増やせばよいが,その結果,ベジエ曲線の次数が上がる.
それで,ベジエ曲線の良い性質を保ちながら,以上の問題を解決する方法として考えられたのが,B-スプ ラインである.
ベジエ曲線の中心になっているのがベルンシュタイン多項式であるから,この多項式の性質を保って,上 記の問題の起きない関数を求める問題を考えることから始めよう.ベルンシュタイン多項式の性質は,非負 値の関数の組全体で1の分割を与えていることで,欠点となっている点は,[0,1]全区間で正値であること である.従って,ベジエ曲線の問題を解決するためには,区間[0,1]の細分区間で正値,他の区間で0とな る関数で1の分割を与える関数を考えることになる.純粋数学ではこのような1の分割関数は無限回微分 可能性(C∞–級)を要求して指数関数を用いて定義されている.しかし,超越関数の計算は時間が掛かるの で多項式の範囲で考えるという点が,通常の解析学の問題と異なる.特に,グラフィックスのような問題で
は2階までの微分可能性に注意すれば良いので,3次以上の多項式を貼り合わせて関数を作っても2階の微 分可能性は保証される.
例えば,f(x) = −x3 (x < 0), x3 (0 5 x) とするとf0(x) = −3x2 (x < 0), 3x2 (0 5 x), f00(x) =−6x (x <0) 6x (05x)であるから,x= 0において2階微分可能である.
以上のことを考慮して,ベルンシュタイン関数に変わる1の分割関数を,制御点の数だけ用意すれば良 いことになるが,問題に捕われずに形式的な方法(アルゴリズム)を考えて,都合の悪いところを後で修正 すれば良いという考えで構成された方法が次に説明するCox–de Boorの再帰公式である.
B–スプラインの基底関数 P0,P1, . . . ,Pn を制御点列,pを求める関数の次数とする.次のパラメータを 考える.
(1) U ={u0, u1, . . . , um|0 5u0 5u15· · · 5um51} をノットベクトル(knot vector),uj をノット (knot),半開区間[uj, uj+1)をj番目のノット区間(j–th knot span)と呼ぶ.
(2) ノット列は重なったものがあっても良い.uj =uj+1=· · ·=uj+k−1 (k >1)のとき,多重度kの多 重ノット(multiple knot of multiplicityk)といい,uj(k)と表す.
多重でないノットは単純ノット(simple knot)という.
(3) 0< uj<1であるノットは内部ノット(inner knot)と呼ばれる.
(4) ノットが等間隔(u1−u0=u2−u1=· · ·=um−um−1)のとき,ノットベクトルまたはノット列は 一様である(uniform)という.そうでないときは非一様である(non–uniform)という.
このノット列を使って次のように再帰的に1つの関数を定義する.これをB–スプラインの基底関数(basis function)という.
Ni,0(t) =
1 (ui5t < ui+1) 0 (otherwise) Ni,p(t) = t−ui
ui+p−ui
Ni,p−1(t) + ui+p+1−t ui+p+1−ui+1
Ni+1,p−1(t)
但し,多重ノットの場合はNi,0 の段階で1 の値を取る範囲はないので,0値の定数関数とする.また,次 のNi,1(t)の計算で 0
0 という計算が出てくるが,このときは0とする.B–スプラインの基底関数は次の性 質を持つ.
(1) Ni,p(t)はp次の多項式である.
(2) Ni,p(t)=0
(3) Ni,p(t)>0 (ui5t < ui+p+1)
(4) 区間[ui, ui+1)において,Ni−p,p(t), Ni−p+1,p(t), . . . , Ni,p(t)以外の関数の値は0である.
(5) Pi
k=i−pNk,p(t) = 1 (ui 5t < ui+1). 即ち,区間[ui, ui+1)において正値の関数全体で1の分割を 与えているので,この区間に対するスプラインが定義できる.
(6) ノットの数を m+ 1,基底関数の次数をp,制御点の個数をn+ 1 とすると,m=n+p+ 1が成立し なければならない.この関係式は,制御点の個数n+ 1 とB–スプラインの次数pを与えると,必要 なノットの個数がこの関係式から規定されることを表す.
(7) 多重度kの多重点において,基底関数Ni,p(t)はCp−k級の関数である.即ち,p−k階微分可能で,
その導関数が連続である.
B–スプライン 上記の基底関数を使って次のように曲線を定義する.この曲線をB–スプライン(B–spline) という.
C(t) = Xn i=0
Ni,p(t)Pi (23)
ベルンシュタイン関数は,区間[0,1]の全てにおいて1の分割を与えていた.特に,B0,n(0) = 1, Bn,n(1) = 1 であるから,ベジエ曲線の両端はP0,Pn を通っている.しかし,B–スプラインの場合は,基底関数が N0,p(0) = 0, Nn,p(1) = 0であるから,このままでは制御点の両端からはなれてしまう.実際,次の定義が ある.
(1) B–スプラインが制御点列の両端の点を通らないとき,開いた(open) B–スプラインであるという.
(2) B–スプラインが制御点の両端の点を通るとき,留められた(clamped) B–スプラインであるという.
(3) 制御点列に重複点があって,ノットにも適当な条件があると,B–スプラインも閉じた(closed)曲線に なる.
但し,以上の定義はテキストによって異なることがある.B–スプラインの性質を次にあげる.
(1) p次B–スプラインの本当の定義区間は[up, un−p]である.この範囲の外では基底関数の和が1 にな らない.
(2) 留められたp–次のB–スプラインを得るには,最初と最後が p+ 1 重のノットベクトルu0 =u1 =
· · ·=up= 0, um−p=um−p+1=· · ·=um= 1を用いれば良い.
(3) 内部ノットがないとき,(u0=· · ·=up= 0, up+1 =· · ·=u2p+1 = 1)得られるB–スプラインはベ ジエ曲線となる.
(4) tがノットであるとき,例えばt=ukのとき,曲線上の点C(uk)をノット点(knot point)という.ノッ ト点で分割されたB–スプラインは同じ次数のベジエ曲線である.
(5) 制御点の個数をn+ 1, B–スプラインの次数を p, ノットの個数をm+ 1 とするとm=n+p+ 1の 関係が成立する.
(6) B–スプラインは制御点列の作る凸閉包に含まれる.
詳しくいえば,ui5t < ui+1 のとき,p次の曲線C(t)は,制御点列Pi−p,Pi−p+1, . . . ,Piの作る凸 閉包に含まれる.
(7) 制御点 Pi を移動させても,ノット点 C(ui)からC(ui+p+1)まで部分曲線以外の部分曲線は不変で ある.
(8) 制御点列をアフィン変換して得られた制御点列の作るB–スプラインは,始めの曲線に同じアフィン 変換を施したものと一致する.
以上のような性質を持っている利点を生かして,適当なノットベクトルと3次のB–スプラインでかなり 色々な曲線が近似できる.しかし,B–スプラインは多項式曲線であるので,円錐曲線などの2次曲線を始 め超越曲線はB–スプラインでは近似できない.これらの曲線を描くためには更に非一様有理B–スプライ ンNURBS(non-uniform rational B–spline)が必要になる.