「イラレの円は本当は円じゃない」というけど誤差はどれくらいなのか

次の記事が興味深かった。
イラレの円は本当は円じゃない http://d.hatena.ne.jp/n-yuji/20131017/p1

Illustratorの楕円ツールで書く円は、本当は円(wikipedia:円 (数学))ではなくて、近似値なんです。つまり、円としてはわずかに歪んでいるわけ。これはベジェ曲線wikipedia:ベジェ曲線)というものを使う以上、そういう仕様なのですね。

http://d.hatena.ne.jp/n-yuji/20131017/p1

Illustratorで用いられる3次のベジェ曲線は、パラメータtと4つの制御点C0〜C3を用いて次のように表現される。

3次の多項式で表現される曲線なので、実際のところ円を正確に表現できない。
この問題を解決するために、NURBS曲線が発明されてCADソフトなどで使われたりしているのだけど、Illustratorでは円を描く時にもベジェ曲線が使われているようだ。

でも、普通にIllustratorを使っている範囲では円の歪みは全然気にならない。

では実際、どの程度の歪み(誤差)があるのだろう。

調べてみよう!

まず、Illustratorは、円の4分の1を一つの曲線要素として扱っているようなので、4分の1の円弧を3次ベジェ曲線で表現するものとする。

半径を1とした場合、4つの制御点の位置は次のようになる。

この a の値はいくつだろう。
実際にIllustratorで半径100mmの円弧をかいて調べてみよう。

円の右端に書いた直線は、制御点の1つと右端点のアンカーポイントを結んだもの。

さて、その長さを見てみると・・

55.229mm だ。

ということで、Illustrator では、原点を中心とする半径1の円の4分の1をかく場合、制御点の座標値は次のように設定されることになる。

(0, 1), (0.55229, 1), (1, 0.55229), (1, 0)

では、このようなベジェ曲線が実際の円とどの程度異なるかExcelで評価してみる。

結果は上の表のとおり。

aの値を0.55229と設定し、パラメータtを0から1まで0.01刻みで変化させた時の、x座標、y座標、および原点からの距離(d)を求めた。

このdの値の最小値は1で、最大値は1.000274であった。

つまり、

Illustratorで作図した円は、実際の円よりも少し外側に広がった円となり、その誤差(はみ出た部分の幅)は半径1メートルの円で最大0.274ミリ程度である。

ちなみに、もっとも誤差が大きくなったのはパラメータtの値が0.21および0.79のときで、それぞれ角度が70.7度、19.3度のときに相当する。


ところで・・・・。

このaの値が0.55229というのは、Illustratorからとってきたわけだけど、これが本当に最適な値だろうか。
もっと誤差を小さくすることはできないのか?

ということで、誤差を最小とするaの値を Excel で探してみた。

ここでの誤差とは、
(各点と原点との距離 - 1)の2乗の和
とする。

つまり、円の内側と外側の両方を通っても構わないから、とにかく円に近い曲線にしようという考え。

このような最適化計算は、Excelのゴールシークを使って行える。

(関連エントリ) Excelによる科学技術計算 http://d.hatena.ne.jp/Zellij/20110911

しかしながら、今回はより精度のよいソルバー「GRG非線形」で100回の反復を行うものとした。

その結果得られた解は・・・

a = 0.551970381

Illustrator の値(0.55229)と少し違う。誤差の評価は次のようになった。

Illustrator で描いた円の誤差:2.92258E-06
上記の最適解で描いた円の誤差:1.76808E-06

Illustrator のものより、40%だけ誤差を減らすことができた。

原点からの距離について見てみる。
最大値 1.000206293
最小値 0.999833281
一部分で、円の内側を通っていることがわかる。

つまり、Illustrator では、円を横切るような円弧ではなく、多少誤差が大きくなってもよいので、一貫して円の外側を通る円弧を描くような設定になっている。と読み解くことができる。
円の内側を通ってよければ、もっと誤差を減らせる。

ちなみに、「円の内側を通ってはいけない」という制約を与えたうえで、上記の問題を解くと、実際にIllustratorで用いられている値が得られた。


実際のところは・・・

ここまで検討した後で、ネットでもう少し検索したら、次のようなページがあった。

■ Drawing a circle with Bézier Curves
http://www.whizkidtech.redprince.net/bezier/circle/kappa/

(やっぱり、詳しい情報を求めると英語のサイトになってしまう)

ここで書かれている内容は、
「角度が45度の点が、正円と一致するようにする」
というもの。

このような制約のもとで値aを計算すると、次のような値になるらしい。

この値は「0.5522847」。

Illustrator は、この値を使っているのかもしれない。

追記

上記の値は、
1をルート2からひいて、3で割って、4をかける。」
のように、1,2,3,4で覚えるといいらしい。
使う機会あるかな?

Excelで操る! ここまでできる科学技術計算

Excelで操る! ここまでできる科学技術計算

曲線と曲面の微分幾何

曲線と曲面の微分幾何