Bスプライン曲線

Bスプライン曲線とは、次数と制御点およびノットパラメータが与えられた時に、複数の点を重み付けしその重み付けを変えながら曲線を構成する手法である。隣接する「次数+1」個の制御点が使用される。曲線として構成されるのは1次以上の次数である。
次数が上がるほどより遠くの点も重みも考慮して曲線を引くようになるので、より滑らかな曲線となる。

定義

制御点ベクトルを \vec{p}_{i} (i=0, 2, \dots, L-1)とし、各制御点ベクトルに対応するノットパラメータを t_{i}とする。ノットパラメータは、 tの値が t_{i}のときに曲線が \vec{p}_{i}(t)の近くにいて欲しいというような意味で設定するパラメータである。このとき、n次のBスプライン曲線は

\begin{equation}
\vec{P}(t) = \displaystyle{\sum_{i=0}^{L-1}N_{i}^{n}(t)\vec{p}_{i}}
\end{equation}

と表される。ここで、重み N_{i}^{n}は以下の式で、次数nが小さい方から漸化式を使ってされる。

\begin{eqnarray}
N_{i}^{0} (t) &=& 1\ \ \  if (t_{i} \le t \le t_{i+1})\ \ \   else\ \  0 \\\
N_{i}^{n} (t) &=& \displaystyle{\frac{t-t_{i}}{t_{i+n}-t_{i}}N_{i}^{n-1}(t) + \frac{t_{i+n+1}-t}{t_{i+n+1}-t_{i+1}}N_{i+1}^{n-1}(t)} (n \ge 1)
\end{eqnarray}

簡単な例

一定間隔のノットパラメータ (0, \Delta t, 2\Delta t, \dots, (L-1)\Delta t)の場合に重みパラメーがどうなるかを考える。 漸化式は

\begin{equation}
N_{i}^{n} = \displaystyle{\frac{t-t_{i}}{n\Delta t}N_{i}^{n-1}(t) + \frac{t_{i+n+1}-t}{n\Delta t}N_{i+1}^{n-1}(t)}
\end{equation}

となり、以下のように図示される。

f:id:salpik:20201209213003p:plain
重み係数の分布(見やすくするため次数ごとに高さを変えている)
1次の重みである緑線に着目すると、例えば \Delta t \le t \le tの範囲では2つの関数が重なっており、この区間においては2点の重みを変えながら曲線が構成される、すなわち2点を結ぶ直線となることがわかる。したがって1次のスプライン曲線は各制御点を結んだ直線となる。

同様に2次の重みに着目すると、3つの関数が重なっているので、隣接3点を使った曲線が構成されることがわかる。

参考

https://shoichimidorikawa.github.io/Lec/CG-Math/Bspline.pdf