ふわふわぷかぷか

最近はイラレとAeにはまってます。全ての画像は無断転載・無断利用禁止です。

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

Windows10、CC2021

スクリプトでサインカーブの描画中

サインカーブ(正弦波)を描画するイラレスクリプトです。

高さ(振幅)・回数・波長を調整できます。

ある程度長い曲線になると1の位が無視されて、他の数字も変更できなくなってしまいます。

数字を小さくすると変更できるようになります。

どこか式が変なのかもしれないけど、私が困らないのと作る時間を考えてここまでで

※このスクリプト を使用して問題が起きた場合責任は負いません。 

 

こんな感じです↓ 

 

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();//作成したウインドウを表示


//----[ここまで]----

 

旧:カーブできないバージョン

こんな感じです↓  (録画したとき振幅と波長を間違えてました)

 

 

 以下ソースコードです。

#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とかプログラミングの覚え書き -

正弦波の式 | 光学技術の基礎用語