Adobe Illustratorで関数曲線


Illustratorで数学の曲線を描く。

参考:クリエイター手抜きプロジェクト(Illustrator編)


javascriptで書いたらいいらしい。.jsファイルをイラレの「ファイル>スクリプト>その他のスクリプト」で選択すれば読み込まれる。離散化された点を線で結んだだけだから近似曲線になるけど、十分な数点を用意すればまあ問題ないかと。(カクカクが気になるのであればパスの単純化で一応なめらかにはなる。)

ということで、以下いくつか例を。扱いやすい?ように、全部コードの中で高さHと幅Wを指定してる。(そのせいで一旦最大値で規格化したりしてて、書き方がまどろっこしくなってしまってる…。)なんかもうぐちゃぐちゃ。曲線でるからまあいいか…。



1. 放物線(二次関数)


n次関数ならMath.pow(x,2)⇒Math.pow(x,n)

W = 100; //横幅
H = 100; //縦幅
step = 1; //描画ステップ
 
passData = [];
count = 0;
for (i=-W; i<=W; i+=step)
{
x = i /2;
y = H * Math.pow(x,2) / Math.pow(W/2,2);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; //塗りなし
pObj.stroked = true; //線あり
pObj.strokeWidth = 1; //線幅1pt



2. 三角関数


ここではとりあえずsin(x)を。cos(x)ならMath.sin()⇒Math.cos()に変更。同じノリでtanをやっちゃうと、発散してすごいことになるので注意。描画はされるけどキャンバスからめちゃくちゃはみ出るので極は除いた方がいい。ちなみにイラレの「効果>パスの変形>ジグザグ(なめらか)」で直線をうにゃらせたものは正弦波とは全く異なる。

W = 100; //横幅
H = 50; //縦幅
k = 1; //波数

step = 5; //描画ステップ
startP = 0; //開始角度(度数法)
endP = 360; //終了角度(度数法)
passData = [];
count = 0;
for (i=startP; i<=endP; i+=step)
{
r = i * Math.PI / 180;
x = W * r / (2 * Math.PI);
y = (H / 2) * Math.sin(k * r);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; //塗りなし
pObj.stroked = true; //線あり
pObj.strokeWidth = 1; //線幅1pt



3. 波数k1のsin波を波数k2のsin波でAM変調させた波

W = 100; //横幅
H = 50; //縦幅
k1 = 1; //波数1
k2 = 10; //波数2

step = 1; //描画ステップ
startP = 0; //開始角度(度数法)
endP = 360; //終了角度(度数法)
passData = [];
count = 0;
for (i=startP; i<=endP; i+=step)
{
r = i * Math.PI / 180;
x = W * r / (2 * Math.PI);
y = (H / 2) * Math.sin(k1 * r) * Math.sin(k2 * r);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; //塗りなし
pObj.stroked = true; //線あり
pObj.strokeWidth = 1; //線幅1pt




4. 指数関数的に減衰する振動


W = 100; //横幅
H = 60; //縦幅
k = 5; //波数

step = 1; //描画ステップ
startP = 0; //開始角度(度数法)
endP = 360; //終了角度(度数法)
passData = [];
count = 0;
for (i=startP; i<=endP; i+=step)
{
r = i * Math.PI / 180;
x = W * r / (2 * Math.PI);
y = (H / 2) * Math.cos(k * r) * Math.exp(-0.5 * r);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; //塗りなし
pObj.stroked = true; //線あり
pObj.strokeWidth = 1; //線幅1pt



5. 指数関数的に減衰する歳差運動


R = 100; // 開始半径
step = 5; //描画ステップ
startP = 0; // 開始角度(度数法)
endP = 3600; // 終了角度(度数法)
passData = [];
count = 0;
for (i=startP; i<=endP; i+=step)
{
r = i * Math.PI / 180;
x = R * Math.exp(-0.1*r)*Math.sin(r);
y = R * Math.exp(-0.1*r)*Math.cos(r);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; // 塗りなし
pObj.stroked = true; // 線あり
pObj.strokeWidth = 1; // 線幅1pt



6. ガウシアン(正規分布)


W = 100;
H = 3000;
s = 25; //分散
step = 1; //描画ステップ

passData = [];
count = 0;
for (i=-W; i<=W; i+=step)
{
x = i;
y = H/(Math.sqrt(2*Math.PI)*s) * Math.exp(-(x*x)/(2*s*s));
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; //塗りなし
pObj.stroked = true; //線あり
pObj.strokeWidth = 1; //線幅1pt

暫定版。縦横比とか分散具合がうまく行っていない


7. ローレンチアン(コーシー分布)


W = 100;
H = 100;
step = 1; //描画ステップ
 
passData = [];
count = 0;
for (i=-W; i<=W; i+=step)
{
x = 0.2*i;
y = H/(1+x*x);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; //塗りなし
pObj.stroked = true; //線あり
pObj.strokeWidth = 1; //線幅1pt

これも暫定版。


8. おまけ。 MONTBLANC(筆記具メーカー)のロゴみたいなの


媒介変数表示した円の半径をsinで変調させてる。(ここでは狙って6周期)

A = 100; //基本の半径
B = 16; //波の振幅
step = 1; // 描画ステップ
startP = 0; // 開始角度(度数法)
endP = 360; // 終了角度(度数法)
passData = [];
count = 0;
for (i=startP; i<=endP; i+=step)
{
r = i * Math.PI / 180;
R = A + B * Math.sin(6*r);
x = R * Math.sin(r);
y = R * Math.cos(r);
passData[count++]= [x, y];
}
docObj = activeDocument;
pObj = docObj.pathItems.add();
pObj.setEntirePath(passData);
pObj.filled = false; // 塗りなし
pObj.stroked = true; // 線あり
pObj.strokeWidth = 1; // 線幅1pt


サイクロイドは既にやっている方がいたので必要な方はそちらをどうぞ。クロソイドは誰もやってなさそうだったけど、少し面倒なのでいつか時間ができたら取り組む。

あと諸々の複雑な関数になると、グラフソフト(gnuplotとか)で描いてepsで吐き出したものを読み込んだ方が多分早い。


Adobe Illustratorで関数曲線 Adobe Illustratorで関数曲線 Reviewed by mug on 10/30/2016 Rating: 5

0 件のコメント:

Powered by Blogger.