前回の記事から、Bスプライン曲線を用いた離散的で不連続な指令点を連続で滑らかに補間する方法を紹介しています。
今回の記事では、Bスプライン曲線の基本式に含まれているBスプライン基底関数の作成方法とを紹介していきます。
Bスプライン曲線の基本式
前回のおさらいです。
Bスプライン曲線の基本式は
$$ \boldsymbol{ S }(u) = \displaystyle \sum_{ i = 0 }^{ p-1 } \boldsymbol{ P }_i b_{i,n}(u) \ , \quad u \in [u_0,u_{m-1}] $$
と表されます。
基本式からも分かるように、Bスプライン曲線は、制御点(Control Point、Pi)とノットベクトル(Knot Vector、u)を用いて定義されるBスプライン基底関数(B-spline Basis Function、bi,n)で求めることが出来ます。
今回は、前回の記事で紹介したノットベクトルuを用いて、Bスプライン基底関数bi,nを作成する方法を紹介します。
ノットベクトルの詳しい作り方は、こちらの記事を参考にしてください。
Bスプライン基底関数
作成したノットベクトルuを用いて、Bスプライン基底関数を作成します。
B‐スプライン基底関数は
$$ \begin{eqnarray} \begin{array}{l} b_{j,0}(u) := \left\{ \begin{array}{l} 1 \quad \mathrm{if} \ u_j \leq u \lt u_{j+1}\\ 0 \quad \mathrm{otherwise} \end{array} \right. \ , \quad j=0,1,\cdots, m-2 \\ b_{j,k}(u) = \frac{u-u_j}{u_{j+k}-u_j} b_{j,k-1}(u) + \frac{u_{j+k+1}-u}{u_{j+k+1}-u_{j+1}} b_{j+1,k-1}(u) \ , \quad j=0,1,\cdots, m-k-2 \end{array} \end{eqnarray} $$
のようにノットベクトルu内のノットを用いて定義されます。
ここで、bi,nはBスプライン基底関数、ujはノットベクトルu内にしてください。含まれるm個のノットの内j番目のノットです。
bj,0(u)の式について
まず、1つ目のbj,0(u)の式について説明していきます。
$$ b_{j,0}(u) := \left\{ \begin{array}{l} 1 \quad \mathrm{if} \ u_j \leq u \lt u_{j+1}\\ 0 \quad \mathrm{otherwise} \end{array} \right. \ , \quad j=0,1,\cdots, m-2 $$
この式は、変数uが指定された範囲内なら1を、それ以外なら0を返すということを表しています。
例えば簡単な例としてノットベクトルuが
$$ \boldsymbol{u} = [0,1,2,3,4] $$
の一様ノットベクトルの場合を考えます。
この場合、b0,0の値は変数uがu0からu1の間なら1をそれ以外なら0となるため、変数uが0から1の間は1となり、それ以外の範囲である1から4の間は0になります。
同様に、b1,0の値は変数uがu1からu2の間なら1をそれ以外なら0となるため、変数uが1から2の間は1となり、それ以外の範囲である0から1の間と2から4の間は0になります。
今回のシリーズで用いる開一様ノットベクトルの場合も同様な考え方でbj,0(u)を求めることが出来ます。
開一様ノットベクトルの例としてノットベクトルuが
$$ \boldsymbol{u} = [0,0,0,0.25,0.5,0.75,1,1,1] $$
と与えられた場合を考えます。
この時のb0,0の値は変数uがu0からu1の間なら1をそれ以外なら0となりますが、u0とu1が同じ値(0)であり1となる範囲が存在しないため、常に0を返すことになります。
またb1,0も同様に常に0を返します。
そしてb2,0の値は変数uがu2=0からu3=0.25の間なら1をそれ以外なら0となるため、常に0ではなく変数uが0から0.25の間は1となります。
この様な考え方でm-1個のbj,0(u)の式を求めていきます。
bj,k(u)の式について
次に、2つ目のbj,k(u)の式について説明していきます。
$$ b_{j,k}(u) = \frac{u-u_j}{u_{j+k}-u_j} b_{j,k-1}(u) + \frac{u_{j+k+1}-u}{u_{j+k+1}-u_{j+1}} b_{j+1,k-1}(u) \ , \quad j=0,1,\cdots, m-k-2 $$
この式が示しているように、k番目のBスプライン基底関数の値であるbj,k(u)を求めるためには、ノットベクトルu内のノットに加えて、1つ前のbj,k-1(u)のBスプライン基底関数の値を用います。
例えば、k=1番目のj=0のBスプライン基底関数であるb0,1(u)を求める際の式は、1つ前のb0,0(u)とb1,0(u)を用いて
$$ b_{0,1}(u) = \frac{u-u_0}{u_1-u_0} b_{0,0}(u) + \frac{u_2-u}{u_2-u_1} b_{1,0}(u) $$
と表されます。
同様に、k=2番目のj=1のBスプライン基底関数であるb1,2(u)を求める際の式は、1つ前のb1,1(u)とb2,1(u)を用いて
$$ b_{1,2}(u) = \frac{u-u_1}{u_3-u_1} b_{1,1}(u) + \frac{u_4-u}{u_4-u_2} b_{2,1}(u) $$
と表すことが出来ます。
この様な考え方でkの値がスプライン曲線の次数nになるまで、m-k-1個のbj,k(u)の式を求めていきます。
まとめ
今回の記事では、Bスプライン曲線による不連続な指令点の補間をするために必要となるBスプライン基底関数の作成方法を紹介しました。
次回は、今回までに紹介した知識を用いて実際にBスプライン曲線を作成していきたいを思います。