「イラレの円は本当は円じゃない」というけど誤差はどれくらいなのか
次の記事が興味深かった。
■ イラレの円は本当は円じゃない 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で覚えるといいらしい。
使う機会あるかな?
- 作者: 神足史人
- 出版社/メーカー: 丸善
- 発売日: 2009/09/30
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 13回
- この商品を含むブログ (6件) を見る
- 作者: 小林昭七
- 出版社/メーカー: 裳華房
- 発売日: 1995/09/01
- メディア: 単行本
- 購入: 3人 クリック: 63回
- この商品を含むブログ (19件) を見る