円をベジェに変換しよう2ヽ(´∀`)ノ

参考ページ(http://www.tensyo.com/urame/prog/ALGO.HTM#C1)にもあるのですが、単位円をベジェに変換するためには

ベジェ曲線の方程式は
    x(t) = (1-t)^3 x_1 + 3(1-t)^2 t x_2 + 3(1-t) t^2 x_3 + t^3 x_4
    y(t) = (1-t)^3 y_1 + 3(1-t)^2 t y_2 + 3(1-t) t^2 y_3 + t^3 y_4ベジェ曲線への当て嵌め方は
   1)  端点が一致する事
   2)  中間点が一致する事
   3)  微分が t=0,t=1で一致する事

からベジェの各制御点を求める必要があります。

円上の開始角度を\theta_1終了角度を\theta_2、ベジエの各制御点を(x_1, y_1), (x_2, y_2), (x_3, y_3), (x_4, y_4)、ベジェの式をx(t), y(t)とおくと、上の条件から

  1. 端点が一致する事
    •  x_1 = \cos \theta_1, x_4 = \cos \theta_2
    •  y_1 = \sin \theta_1, y_4 = \sin \theta_2
  2. 中間点が一致すること
    •  x(\frac{1}{2}) = \frac{1}{8} \left\( x_1 + 3 x_2 + 3 x_3 + x_4 \right\) = \cos \left\( \frac{\theta_1 + \theta_2}{2} \right\)
    •  y(\frac{1}{2}) = \frac{1}{8} \left\( y_1 + 3 y_2 + 3 y_3 + y_4 \right\) = \sin \left\( \frac{\theta_1 + \theta_2}{2} \right\)
  3. 微分が t=0,t=1で一致する事
    •  \frac{-x_1 + x_2}{-y_1 + y_2} = -\tan \theta_1
    •  \frac{-x_3 + x_4}{-y_3 + y_4} = -\tan \theta_2

未知数8つで、式も8つなのでこれは解くことができます。ただ x_1, x_4, y_1, y_4は分かってるも同然なので、これをふまえ少し簡単にしたものが、以下の式です。

  •  x_2 \cos \theta_1 + y_2 \sin \theta_1 = 1
  •  x_3 \cos \theta_2 + y_3 \sin \theta_2 = 1
  •  x_2 + x_3 = \frac{8 \cos \left\( \frac{\theta_1 + \theta_2}{2} \right\) - \cos \theta_1 - \cos \theta_2}{3} = A
  •  y_2 + y_3 = \frac{8 \sin \left\( \frac{\theta_1 + \theta_2}{2} \right\) - \sin \theta_1 - \sin \theta_2}{3} = B

(A, B は定数)

そして、これをがりがりと計算していくと以下の解が得られます。
 x_2 = \frac{A \sin \theta_1 \cos \theta_2 + B \sin \theta_1 \sin \theta_2 - \sin \theta_1 - \sin \theta_2}{\sin \left\( \theta_1 - \theta_2 \right\)}
 y_2 = - \frac{A \cos \theta_1 \cos \theta_2 + B \cos \theta_1 \sin \theta_2 - \cos \theta_1 - \cos \theta_2}{\sin \left\( \theta_1 - \theta_2 \right\)}
 x_3 = - \frac{A \cos \theta_1 \sin \theta_2 + B \sin \theta_1 \sin \theta_2 - \sin \theta_1 - \sin \theta_2}{\sin \left\( \theta_1 - \theta_2 \right\)}
 y_3 = \frac{A \cos \theta_1 \cos \theta_2 + B \sin \theta_1 \cos \theta_2 - \cos \theta_1 - \cos \theta_2}{\sin \left\( \theta_1 - \theta_2 \right\)}
これでやっとベジェに変換できました。あとはこれをプログラムに直してしまえばOKです。注意として、分母にあるsinの値が0に近くなりすぎないよう常に監視する必要があります。これを怠るとプログラムの挙動がおかしくなります。というか、なったんですが(^^; また円を分割してベジェを求める場合、最初のベジェ曲線を変換行列で回転させればいちいちこんな計算をしなくてすみます。

ちなみに参考ページにある求め方はこれの特殊な場合で、\theta_1 = 0を代入すれば全く同じ解き方になります。時間のある方は試してみてはどうでしょうか?

ではでは。皆様お休みなさい。よい夢を。