スプライン補間の計算について -その1-

理論関係

前回の記事でRhinocerosのGrasshopperでスプライン補間ができることについてまとめました。

今回はこれを実際に作るときの計算方法、つまり理論的なところを追っていきたいと思います。

スプライン曲線の基本式

前提条件

曲線の媒介変数をtとし、0\leqq t \leqq 1の区間の変数とします。
(GrasshopperのReparameterizeをした状態と同じですね)
また、補間点はN+1個あるとし, \boldmath P_0, P_1, ..., P_n と表現します。
ここで\boldmath P_iから \boldmath P_{i+1} を補間する曲線を S_iとおくことにします。

さて、このときの3次のスプライン補間の基本式は

(1)   \begin{equation*}S_i(t) = a_i + b_i(t-t_i) + c_i(t-t_i)^2 + d_i(t-t_i)^3 \end{equation*}

また、この式をtで微分すると

(2)   \begin{equation*}S'_i(t) = b_i + 2c_i(t-t_i) + 3d_i(t-t_i)^2 \end{equation*}

また二階微分は

(3)   \begin{equation*}S''_i(t) = 2c_i + 6d_i(t-t_i)\end{equation*}

となります。

スプライン補間の条件

条件1 曲線は点を通る

\boldmath P_iから \boldmath P_{i+1} を補間する曲線を S_i と先ほど定義しました。なので次の関係が条件として考えられます。

(4)   \begin{equation*}S_i(t_i) = \boldmath P_{i}\end{equation*}

(5)   \begin{equation*}S_i(t_{i+1}) = S_{i+1}(t_{i+1}) = \boldmath P_{i+1}\end{equation*}

これは余談ですが、今この記事で扱っているのはスプライン曲線です。似た名前でB-スプライン曲線というものがあります。このブログで主に扱っている3DCAD RhinocerosはNURBSモデラとよく呼ばれますが、NURBSはNon-Uniform Rational B-Spline なのでB-スプラインの一種です。
どちらも、点を入力として与えますが、Bスプライン曲線は、すべての点を通るとは限りません。スプライン曲線、スプライン補間は基本的には点を通ります。

条件2 曲線は滑らかにつながる

補間点 \boldmath P_{i+1} の両サイドに曲線S_{i}と,S_{i+1}があって、どちらもt = t_{i+1}というパラメータを共有しています。この点において①接線が同じであること②曲率が同じであることが条件です。

なので

(6)   \begin{equation*} S'_i(t_{i+1}) = S'_{i+1}(t_{i+1}) \end{equation*}

(7)   \begin{equation*} S''_i(t_{i+1}) = S''_{i+1}(t_{i+1}) \end{equation*}

を満たす必要があります。ちなみにこれらをC1連続,C2連続と言ったりもします。

条件3 端点の処理

これは、スプラインが閉曲線か開曲線か、などで様々なモノがありますが一番自然な、自然スプラインの条件を加えておきます。開曲線の場合、S_0(0)S_{n-1}(1)において、対となる曲線がいないので、式(6), 式(7)のような条件が使えません。
そこで次の条件を加えます。

(8)   \begin{equation*} S''_i(0) = S''_{n-1}(1) = 0 \end{equation*}

ここでパラメータは0\leqq t \leqq 1の区間の変数と定義しているので0,1が使われています。もっと一般的に書くこともできますがめんどくさい ややこしくなるのでこう書きました。

まとめ

いま補間点は0~nなのでn+1個あって、それをつなぐn個の曲線があります。式(1)より各曲線には4個(a,b,c,d)の未知数があるので、曲線全体で未知数は4n個あることになります。

条件1よりすべての曲線の両端と点の関係から、2n個の方程式ができ、
条件2の接線の連続性から、n-1個の方程式ができます。さらに
条件2の曲率の連続性から、n-1個の方程式ができます。最後に
条件3から2個の方程式ができます。

つまり、4n個の未知数に対し、4n個の方程式ができた!ということになります。

あとは解くだけです!

今回はこんなところで。また続きかきます!忘れないうちに。

コメント

タイトルとURLをコピーしました