2次ベジェ曲線を3次ベジェ曲線に変換
2次ベジェ曲線より、3次ベジェ曲線の方が自由度が高いので、変換ができます。
3次ベジェ曲線の制御点を とすると、
2次ベジェ曲線の端点は3次ベジェ曲線の端点と一致するので、制御点は となります。
3次ベジェ曲線上の点を 、2次ベジェ曲線上の点を とします。
位置と1階微分が一致するようにすればよいので、次の式が成り立ちます。
ここで、 は以下のようになります。
式 を解くと、以下のようになります。
式 を変形すると、元の制御点の線分上の長さが2/3に新しい制御点があることがわかります。
Pythonのコード
上記の連立方程式は、PythonのライブラリSymPyを使って解きました。
そのコードを載せておきます。
import sympy sympy.var("p_0 p_1 p_2 p_3 q_1 t") p3 = (1-t)**3 * p_0 + 3 * (1-t) ** 2 * t * p_1 + 3 * (1-t) * t ** 2 * p_2 + t ** 3 * p_3 p3d = sympy.diff(p3, t) p2 = (1-t)**2 * p_0 + 2 * (1-t) * t * q_1 + t ** 2 * p_3 p2d = sympy.diff(p2, t) eq1 = sympy.Eq(p3, p2) eq2 = sympy.Eq(p3d, p2d) solve = sympy.solve ([eq1, eq2], [p_1, p_2]) print("\\begin{eqnarray}") print("&&P_3(t)=" + sympy.latex(p3) + "\\\\") print("&&P_3'(t)=" + sympy.latex(p3d) + "\\\\") print("&&P_2(t)=" + sympy.latex(p2) + "\\\\") print("&&P_2'(t)=" + sympy.latex(p2d) + "\\\\") print("&&" + sympy.latex(solve) + "\\\\") print("\\end{eqnarray}")
コードの実行結果
\begin{eqnarray}
&&P_3(t)=p_{0} \left(1 - t\right)^{3} + 3 p_{1} t \left(1 - t\right)^{2} + p_{2} t^{2} \cdot \left(3 - 3 t\right) + p_{3} t^{3}\\
&&P_3'(t)=- 3 p_{0} \left(1 - t\right)^{2} + 3 p_{1} t \left(2 t - 2\right) + 3 p_{1} \left(1 - t\right)^{2} - 3 p_{2} t^{2} + 2 p_{2} t \left(3 - 3 t\right) + 3 p_{3} t^{2}\\
&&P_2(t)=p_{0} \left(1 - t\right)^{2} + p_{3} t^{2} + q_{1} t \left(2 - 2 t\right)\\
&&P_2'(t)=p_{0} \cdot \left(2 t - 2\right) + 2 p_{3} t - 2 q_{1} t + q_{1} \cdot \left(2 - 2 t\right)\\
&&\left\{ p_{1} : \frac{p_{0}}{3} + \frac{2 q_{1}}{3}, \ p_{2} : \frac{p_{3}}{3} + \frac{2 q_{1}}{3}\right\}\\
\end{eqnarray}