前回の記事で、

κ=4(2-1)3=0.55228474983\kappa=\frac{4\left(\sqrt{2}-1\right)}{3}=0.55228474983\cdots (2.1)

のとして、下記の頂点A,Bおよび制御点A',B'で中心角90度の円弧を 近似したベジェ曲線を描いていることを紹介した。

  • A: (0, 1)
  • B: (1, 0)
  • A': (κ, 1)
  • B': (1, κ)
90degree arc using Bézier

このとき、本物と円とどのような差があるのか考察したい。

ベジェ曲線の近似円弧の解析

ベジェ曲線の定義より、ベジェ曲線上の任意の点はパラメータ u(0u1) u(0\leq u \leq 1) を使って、下記の通り表現できる。

P(u)=A(1-u)3+A3u(1-u)2+B3u2(1-u)+Bu3 \bm{P}(u)=\bm{A}(1-u)^3+\bm{A}'3u(1-u)^2+\bm{B}'3u^2(1-u)+\bm{B}u^3 (2.2)

(2.2)式に頂点座標を入れることで、ベジェ曲線による近似円弧のx座標、y座標が得られる:

Px(u)=3κ(1-u)u2+3(1-u)2u+(1-u)3Py(u)=3κu(1-u)2+3u2(1-u)+u3\begin{aligned} P_x(u)&=&3\kappa(1-u) u^2 &+& 3 (1-u)^2 u&+& (1-u)^3\\ P_y(u)&=&3\kappa u (1-u)^2 &+& 3 u^2 (1-u)&+& u^3 \end{aligned} (2.3)

ベジェ曲線の近似円弧の半径方向の大きさは、

P(u)2=Px(u)2+Py(u)2==(136-962)⁢⁢u6+(-408+2882)⁢⁢u5+(442-3122)⁢⁢u4+(-204+1442)⁢⁢u3+(34-242)⁢⁢u2+1\begin{aligned} \|\bm{P}(u)\|^2&=&P_x(u)^2 + P_y(u)^2\\ &=&\cdots\\ &=&\left( 136-96 \sqrt{2}\right) u^6+\left(-408 + 288 \sqrt{2} \right) u^5\\ &&+ \left(442 -312 \sqrt{2}\right) u^4+\left(-204 + 144 \sqrt{2}\right) u^3\\ && + \left(34 -24 \sqrt{2}\right) u^2+1 \end{aligned} (2.4)

u=0,1/2,1のときにこの値が1になることに注目して、 下式のように変形する。

P(u)2=-2(122-17)u2(u-1)2(2u-1)2+1\|\bm{P}(u)\|^2= -2 (12\sqrt{2}-17) u^2 (u-1)^2 (2u-1)^2 + 1 (2.5)

(2.5)式から、 u=0,1/2,1のときに最小値1を取る六次関数になることがわかる。 グラフの概形を描くと、下の図のようになる。 (六次関数らしさを出すためにあえてuの範囲外もプロットしてある)

"下に凸の六次関数曲線"
(2.5)式の図示

さて、最大値について調べるために微分=0を計算する。

dduP(u)2=-2(122-17)(2u(u-1)2(2u-1)2+2u2(u-1)(2u-1)2+4u2(u-1)2(2u-1))==-4(122-17)u(u-1)(2u-1)(6u2-6u+1)=0\begin{aligned} \frac{d}{du} \|\bm{P}(u)\|^2 &=& -2(12\sqrt{2}-17) \left( 2 u (u-1)^2 (2 u-1)^2 + 2 u^2 (u-1) (2 u-1)^2 +4 u^2 (u-1)^2 (2 u-1) \right)\\ &=&\cdots\\ &=&-4(12\sqrt{2}-17) u (u-1) (2u-1) (6 u^2 - 6 u + 1) = 0 \end{aligned} (2.6)

この5つの解のうち、下の2つの解が最大値をとるuの値である。

6u2-6u+1=0u=+3±32-66=12±366\cdot u^2 - 6\cdot u + 1 = 0 \iff u = \frac{+3\pm \sqrt{3^2-6}}{6} = \frac{1}{2} \pm \frac{\sqrt{3}}{6} (2.7)

この結果と(2.5)式より最大値がわかる。

P(12±36)=71-12254=1.000272530\left\|\bm{P}\left(\frac{1}{2}\pm\frac{\sqrt{3}}{6}\right)\right\| = \sqrt{\frac{71-12\sqrt{2}}{54}\,} = 1.000272530\cdots (2.8)

また、このとき円弧上のどのあたりなのかを把握するために、 角度をもとめると

atanPy(12±36)Px(12±36)=atan3+6263±26183+62±632618\atan \frac{P_y\left(\frac{1}{2}\pm\frac{\sqrt{3}}{6}\right)}{P_x\left(\frac{1}{2}\pm\frac{\sqrt{3}}{6}\right)} =\atan\frac{\,\frac{3+6\sqrt{2}\mp 6\sqrt{3} \pm 2\sqrt{6}}{18}\,}{\,\frac{3+6\sqrt{2}\pm 6\sqrt{3} \mp 2\sqrt{6}}{18}\,} (2.9)

数値を求めると以下の角度である:

  • 70.561445…度
  • 19.438554…度

もちろんこの2つは45度を軸に対称的な位置である。

ちなみに、 先程示したグラフの横軸を 0 →1 を 0 →90度と読みかえて 見てしまってもよい近似だったりする。

まとめ

ベジェ曲線の近似円弧における真円との差異について、下記特徴があることがわかった。

  • ベジェ曲線の近似円弧の方が、真円よりも若干大きい
  • 0度、45度、90度の部分は円と重なる
  • 19.44度、70.56度あたりが円と差があるところであり、半径の0.00027倍程度の誤差がある
円と誤差の関係。緑付近は正確、赤付近は若干真円よりも大きい

ベジェ曲線を使う限り円の精度は有効数字4桁程度といったところのようである。

補足:「時空の裂け目」

イラレの円は本当は円じゃない(もしくは時空の裂け目について) にて45度回転させているが、 以上で述べた結論からいうと19.44度ぐらいのほうが ふたつの円の差(時空の裂け目)が良く見える。

参考文献