リンクをクリップボードにコピー
コピー完了
Adobe Illustrator CCにおいて、正円を回転させた際、幅、高さにそれぞれ若干のズレが生じます。
例えば、[ W:100px, H:100px ]の図形を、図形の中心を基準に[ 30° ]回転させた場合、回転後のサイズは[ W:100.017px, H:100.017px ]へと変化します。
他の回転角度によりサイズの変化は様々ですが、いずれも当初のサイズより僅かに大きくなるようです。
尚、45°の倍数の角度(45°, 90°, 135°, …)の回転ではズレは発生しません。
当初ピクセルグリッドへの整合により、自動的にズレが生じているのだと考えていましたが、ポイント、グリッド、ピクセルのスナップを全て解除した状態にしても、依然としてズレが発生してしまいます。
多数の正円を組み合わせたグラフィックを製作中ですが、数値によるコントロールができず、困っています。
解決方法をご存知の方がいらっしゃいましたら、ご教示いただけると幸いです。
よろしくお願いいたします。
ベジェ曲線による円の描画の制御点の位置はなぜ0.55228…なのか?
https://cat-in-136.github.io/2014/03/bezier-1-kappa.html
こちらのブログがとても参考になります。
イラレに正円を描くツールはなく、楕円ツールなどで描く円は、90度の円弧を1つの3次ベジェ曲線で近似したものを、4つつなげたものです。
その際、ハンドルの長さは、リンク先にあるように「真ん中の45度の点において円と一致する」という条件で決めると半径の0.55228…倍になります。イラレでもおおむねこれに近い値が使われています。45度の回転ではサイズが変わらないというのはこのためです。
リンクをクリップボードにコピー
コピー完了
win7/cc2015.5
「ミリ」の単位でも再現しました。更にシェイプの方は正しい数値で変形の数値のみ変わっています。
ご使用のバージョンが不明ですが新しめの物なら修正されているかも知れません。検証が待たれる所です。
あとは円内の模様?を回転させたい等の用途であれば、マスクを使用して中身を回転などはいかがでしょうか。
中身を回転させた状態では数値は変化なしでした。
リンクをクリップボードにコピー
コピー完了
CC2019でも、しんく200 さんの回答と同じくシェイプの値は変わっていないのに、情報パネルの値は変わっています。
下図の値は、サードパーティのメジャーツールを使っています。
<追記>
間違っていました。
普通に円形を作成して、ポイントを追加してメジャーで計測すると、30°や60°は数値が少し変わっています。
回転させると、情報パネルにこの値が表示されたものと思われます。(100pxに設定を変えてあります)
推測ですが、三角関数を使って描画しているので、このような誤差が出たのだと思います。
誤差を少なくする方法としては、円形を作成するときにポイントが12個あれば、30°の回転でも数値は変わりません。
例えば、多角形ツールで12角形を作って、角を曲線にして円形にすれば30°回転しても同じ値になります。
ただし、この方法で100pxピッタリの円形は作れないと思います。(変形メニューでできました)
Illustratorで任意のポイント数で円形を作成する方法があれば良いのですが、有料のプラグインを使う方法以外はわかりません。
リンクをクリップボードにコピー
コピー完了
ベジェ曲線による円の描画の制御点の位置はなぜ0.55228…なのか?
https://cat-in-136.github.io/2014/03/bezier-1-kappa.html
こちらのブログがとても参考になります。
イラレに正円を描くツールはなく、楕円ツールなどで描く円は、90度の円弧を1つの3次ベジェ曲線で近似したものを、4つつなげたものです。
その際、ハンドルの長さは、リンク先にあるように「真ん中の45度の点において円と一致する」という条件で決めると半径の0.55228…倍になります。イラレでもおおむねこれに近い値が使われています。45度の回転ではサイズが変わらないというのはこのためです。
リンクをクリップボードにコピー
コピー完了
上で書いたようにイラレの楕円ツールが描く円は
「90度の円弧を『45度の点において円と一致する』という条件で近似したものを4個つなげたもの」でしたが、
「30度の円弧を『15度の点において円と一致する』という条件で近似したものを12個つなげたもの」を描くスクリプトを作ってみました。かなり円に近づいたと思いますので使ってみてください。
実行するとアートボードの左上に半径100ptの円が生成されるはずです。
(function(){
var path0=app.documents[0].pathItems.add();
var r=100,z=0.17553666,a,b;
for(var i=0;i<12;i++){
var k=Math.PI*(i/6);
var pp0=path0.pathPoints.add();
pp0.anchor=[a=r*Math.cos(k),b=r*Math.sin(k)];
pp0.leftDirection=[a+z*b,b-z*a];
pp0.rightDirection=[a-z*b,b+z*a];
pp0.pointType=PointType.SMOOTH;
}
path0.closed=true;
})();