【Illustratorスクリプト】調整できるサインカーブを描画するスクリプト。
Windows10、CC2021

高さ(振幅)・回数・波長を調整できます。
ある程度長い曲線になると1の位が無視されて、他の数字も変更できなくなってしまいます。
数字を小さくすると変更できるようになります。
どこか式が変なのかもしれないけど、私が困らないのと作る時間を考えてここまでで。
※このスクリプト を使用して問題が起きた場合責任は負いません。
こんな感じです↓
正弦波を描く。
— ふわぷか (@float_jelly) 2025年2月26日
カーブできるようにした。ワープのアーチと同じような結果かな?円弧みたいにできるとよかったけど。 pic.twitter.com/K06wFYpolR
Aeのエクスプレッションと似てる気がする。
イラレに時間の概念が無いから、xに一定の数を足すことで疑似的に時間を進めながら点を打ってる感じ?
以下ソースコードです。
#target "illustrator" function setRGBColor(r,g,b){ var tmpColor = new RGBColor(); tmpColor.red = r; tmpColor.green = g; tmpColor.blue = b; return tmpColor; } //アートボードのサイズを取得 var artindex = app.activeDocument.artboards.getActiveArtboardIndex(); var artpoint = app.activeDocument.artboards[artindex].artboardRect; var x1 = artpoint[0]; var y1 = artpoint[1]; var x2 = artpoint[2]; var y2 = artpoint[3]; var artheight = (-y2+y1)/2 //動作 function make(){ var newhieght = Number(hieght.text)*0.1; // 数値に変換 var newtimes = Number(times.text); // 数値に変換 var newwavelength = Number(wavelength.text); // 数値に変換 var halfwavelength =newwavelength/2; //長さ var newcurve =Number(curvetext.text); //カーブの強さ var start = 0; //最初の角度 var time = halfwavelength*2*newtimes; //最後の角度 var step = 2; //描画ステップ var curve = time/2; //長さ var x = -curve; //放物線の始まり var anchorpoint = []; for (var theta = start; theta <= time; theta += step) { var theta_rad = theta * Math.PI / halfwavelength; x += step; var curvey = 0.0001*newcurve * Math.pow(x, 2); var y =(100* Math.sin(theta_rad)*newhieght)-artheight-curvey; anchorpoint.push([theta, y]); } const docObj = activeDocument; var pObj = docObj.pathItems.add(); pObj.setEntirePath(anchorpoint); pObj.filled = false; pObj.stroked = true; pObj.strokeWidth = 1; } //ダイアログを表示 var dialog = new Window("dialog","設定",[0,0,210,210]); dialog.add ("statictext", [10,20,60,40], "高さ"); var hieght = dialog.add("edittext",[60,15,150,40],"2");//数の入力 dialog.add ("statictext", [10,50,60,70], "回数"); var times = dialog.add("edittext",[60,45,150,70],"4");//数の入力 dialog.add ("statictext", [10,80,60,100], "波長"); var wavelength = dialog.add("edittext",[60,75,150,100],"200");//数の入力 dialog.add ("statictext", [155,80,180,100], "px"); dialog.add ("statictext", [10,110,60,130], "カーブ"); var curvetext = dialog.add("edittext",[60,105,150,130],"0");//数の入力 var btnOK = dialog.add("button",[10,150,80,190],"OK",{name:'ok'});//OK var btnCancel = dialog.add("button",[100,150,170,190],"cancel",{name:'cancel'});//CANCEL hieght.active = true; //テキストエリアをフォーカスする dialog.onShow = function() { make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } times.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } hieght.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } wavelength.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } curvetext.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } //キャンセルの処理 btnCancel.onClick = function(){ dialog.close(); } //OKの処理 btnOK.onClick = function(){ dialog.close(); //ダイアログを閉じる make(); } dialog.center();//ウインドウ表示位置をモニターの中心に移動 dialog.show();//作成したウインドウを表示 //----[ここまで]----
旧:カーブできないバージョン
こんな感じです↓ (録画したとき振幅と波長を間違えてました)
正弦波を描く pic.twitter.com/TuQeGjXVXu
— ふわぷか (@float_jelly) 2025年2月25日
以下ソースコードです。
#target "illustrator" function setRGBColor(r,g,b){ var tmpColor = new RGBColor(); tmpColor.red = r; tmpColor.green = g; tmpColor.blue = b; return tmpColor; } //アートボードのサイズを取得 var artindex = app.activeDocument.artboards.getActiveArtboardIndex(); var artpoint = app.activeDocument.artboards[artindex].artboardRect; var x1 = artpoint[0]; var y1 = artpoint[1]; var x2 = artpoint[2]; var y2 = artpoint[3]; var artheight = (-y2+y1)/2 //動作 function make(){ var newhieght = Number(hieght.text); // 数値に変換 var newtimes = Number(times.text); // 数値に変換 var newwavelength = Number(wavelength.text); // 数値に変換 var halfwavelength =newwavelength/2 var start = 0; //最初の角度 var time = halfwavelength*2*newtimes; //最後の角度 var step = 2; //描画ステップ var anchorpoint = []; for (var theta = start; theta <= time; theta += step) { var theta_rad = theta * Math.PI / halfwavelength; var y =(100* Math.sin(theta_rad)*newhieght)-artheight; anchorpoint.push([theta, y]); } const docObj = activeDocument; var pObj = docObj.pathItems.add(); pObj.setEntirePath(anchorpoint); pObj.filled = false; pObj.stroked = true; pObj.strokeWidth = 1; } //ダイアログを表示 var dialog = new Window("dialog","設定",[0,0,190,190]); dialog.add ("statictext", [10,20,60,40], "高さ"); var hieght = dialog.add("edittext",[60,15,150,40],"0.25");//数の入力 dialog.add ("statictext", [10,50,60,70], "回数"); var times = dialog.add("edittext",[60,45,150,70],"4");//数の入力 dialog.add ("statictext", [10,80,60,100], "波長"); var wavelength = dialog.add("edittext",[60,75,150,100],"200");//数の入力 dialog.add ("statictext", [155,80,180,100], "px"); var btnOK = dialog.add("button",[10,120,80,160],"OK",{name:'ok'});//OK var btnCancel = dialog.add("button",[100,120,170,160],"cancel",{name:'cancel'});//CANCEL hieght.active = true; //テキストエリアをフォーカスする dialog.onShow = function() { make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } times.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } hieght.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } wavelength.onChanging = function(){ make(); app.redraw(); //ドキュメントを再描画 app.undo(); //アンドゥ } //キャンセルの処理 btnCancel.onClick = function(){ dialog.close(); } //OKの処理 btnOK.onClick = function(){ dialog.close(); //ダイアログを閉じる make(); } dialog.center();//ウインドウ表示位置をモニターの中心に移動 dialog.show();//作成したウインドウを表示 //----[ここまで]----
参考
Adobe Illustratorで関数曲線 - Schritt für Schritt
illustratorでsin(x)を描く方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -