Catmull-Romスプライン曲線




github | naochang | Curve

Catmull-Romスプライン曲線は制御点を必要とせず、全ての点を通る曲線。エルミート曲線での各点のベクトルに対して下記のように前後の点の位置からベクトルを自動的に作ったもの入れるとその点を通るようになる。

\begin{align}
v_i = \frac{P_{i+1} – P_{i-1}}{2}\\
v_{i+1} = \frac{P_{i+2} – P_i}{2}
\end{align}

エルミート曲線の式は

\begin{align}
f(t) = (2P(0) – 2P(1) + v_0 + v_1)t^3 + (-3P(0) + 3P(1) – 2v_0 – v_1)t^2 + v_0t + P(0)
\end{align}

ここで\(P(0)\)を\(P_i\)、\(P(1)\)を\(P_{i+1}\)とし、\(v_0, v_1\)に上記の\(v_i, v_{i+1}\)を代入すると

\begin{align}
f(t) &=(2P_i-2P_{i+1}+v_i+v_{i+1})t^3+(-3P_i+3P_{i+1}-2v_i-v_{i+1})t^2+v_it+P(0)\\
&= (2P_i-2P_{i+1} + \frac{P_{i+1}-P_{i-1}}{2} + \frac{P_{i+2} – P_i}{2})t^3\\
&+ (-3P_i+3P_{i+1}-2(\frac{P_{i+1}-P_{i-1}}{2})-\frac{P_{i+2} – P_i}{2}))t^2\\
&+ (\frac{P_{i+1} – P_{i-1}}{2})t+P_i\\
&= \frac{1}{2}(4P_i-4P_{i+1}+P_{i+1}-P_{i-1}+P_{i+2}-P_i)t^3\\
&+ \frac{1}{2}(-6P_i+6P_{i+1}-2P_{i+1}+2P_{i-1}-P_{i+2}+P_i)t^2\\
&+ \frac{1}{2}(P_{i+1}-P_{i-1})t + P_i\\
&= \frac{1}{2}(-P_{i-1}+3P_i-3P_{i+1}+P_{i+2})t^3\\
&+ \frac{1}{2}(2P_{i-1}-5P_i+4P_{i+1}-P_{i+2})t^2\\
&+ \frac{1}{2}(-P_{i-1}+P_{i+1})t + P_i
\end{align}

これで曲線の式は完成だが、始点は1つ前のポイントがないので、始点の加速は最初と最後の中間の速度で移動したと仮定するそうです。
\(v_0 = 2(P_1 – P_0) – \frac{P_2-P_0}{2}\)

これを同じエルミート曲線の式に入れると

\begin{align}
f_0(t) &= (2P_i-2P_{i+1}+(2(P_{i+1}-P_i)-\frac{P_{i+2}-P_i}{2})+\frac{P_{i+2}-P_i}{2})t^3\\
&+ (-3P_i+3P_{i+1}-2(2(P_{i+1}-P_i)-\frac{P_{i+2}-P_i}{2})-\frac{P_{i+2}-P_i}{2})t^2\\
&+ (2(P_{i+1}-P_i)-\frac{P_{i+2}-P_i}{2})t + P_i\\
&= \frac{1}{2}(4P_i-4P_{i+1}+4P_{i+1}-4P_i-2P_{i+2}+2P_i+P_{i+2}-P_i)t^3\\
&+ \frac{1}{2}(-6P_i+6P_{i+1}-8P_{i+1}+8P_i+2P_{i+2}-2P_i-P_{i+2}+P_i)t^2\\
&+ \frac{1}{2}(4P_{i+1}-4P_i-P_{i+2}+P_i)t+P_i\\
&= \frac{1}{2}((P_i-2P_{i+1}+P_{i+2})t^2 + (-3P_i+4P_{i+1}-P_{i+2})t + 2P_i)
\end{align}

同様に終点も次点がないので、こちらにしたがって計算すると
\begin{align}
f_n(t) = \frac{1}{2}((P_{n-1} -2P_n + P_{n+1})t^2+(-P_{n-1}+P_{n+1})t+2P_n))
\end{align}

参考)
t-pot | 3次曲線
生存日記

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です