- ・図形の座標を取得したい
- ・三角関数のコードについて学びたい
- ・プログラミングの技術を向上させたい
「Illustratorスクリプトで図形や模様を作れるようになりたい」と思っている人は、多いのではないでしょうか。
しかし、いざIllustratorスクリプトで図形や模様を作成しようと思っても座標の求め方などがわからずに先に進めない人もいるはず。
そこで、今回はサッカーボールの図形を作成するIllustratorスクリプトを紹介します。
この記事を読めば、座標値の取得や三角関数の使い方についてソースコードを見て学習することができますので、ぜひ最後までお読みください。
Profile
この記事を書いている私は、DTPデザイナーとしてIllustratorの操作経験が15年以上あり、スクリプトも自ら作成し、デザイン作業の効率化を図っています。
スクリプトに関する記事を定期的に公開していますので、ぜひご参考にしてください。
関連記事:「完全無料」で作業の効率化!Illustratorスクリプト特集!
【サッカーボール】スクリプトの概要
まず、最初に【サッカーボール】スクリプトの概要ついて下記の内容を解説します。
・開発
・ダウンロード
・スクリプトの使い方
・動作チェック
開発
今回紹介するスクリプト(soccerBall.jsx)は、JavaScript言語をベースに私が自作したIllustrator用のスクリプトです。
主な機能としては、オーソドックスな五角形模様のサッカーボールをアートボードの中に描いてくれます。
スクリプトのポイントは、以下の通りです。
・アートボード内を基準にする
・円と五角形を作成
・座標と角度を求めて回転させる
・クリッピングマスクで形を整える
ダウンロード
本スクリプトは、下記からサンプルとしてダウンロードすることができます。
使用上の注意や免責については「注意事項と免責事項」に記載していますので、必ずお読みください
ダウンロード:soccerBall.jsx
スクリプトの使い方
本スクリプトは、下記のSTEPで使うことができます。
STEP1.ファイルメニューからスクリプトを選択
STEP2.【soccerBall.jsx】を選択
STEP3.実行
なお、次の記事ではそもそもIllustratorスクリプトってどうやって使えばいいのか、活用事例を交えながら紹介しているので良ければ参考にしてください。
関連記事:スクリプトでデザイン革命!Illustratorを最大限に活かす使い方【Mac】
動作チェック
・IllustratorCS6【Win】
・Illustrator2024【mac】
で、動作チェックをおこないました。
【サッカーボール】スクリプトのソースコード
ここでは、【soccerBall.jsx】の動作フローと処理条件がわかるソースコードを紹介します。
説明ようのコメントアウトも含まれていますので参考にしてください。
なお下記の記事では、Illustratorスクリプトを自作する方法についてサンプル事例を交え解説しているのでよければ参考にしてください。
関連記事:デザインを自動化する!Illustratorスクリプトの作り方
ソースコード
var doc = app.activeDocument;
var radius = 300; // ptで円の半径を設定します
var pRadius = Math.round(radius * 38.1 / 100); //五角形の半径を求める
var oneSide = 2 * pRadius * Math.sin(Math.PI / 5); //五角形の一辺の長さを求める Math.sin:サイン計算 Math.PI:円周率の計算
var shotSide = oneSide * 61.8 / 100; //一辺の長さを61.8%に縮小
var middleSide = pRadius * 173.181 / 100; //一辺の長さを173.181%に拡大
var longSide = pRadius * 219 /100 //中心からの距離 Y軸
var pentagonPath = []; //空の配列を作成
var clipObj = doc.groupItems.add(); //グループアイテム
//アートボードの設定 ここから
app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM; //アートボードの座標を基準に
var rect = doc.artboards[0].artboardRect; //アートボード座標
var left = rect[0]; //左
var top = rect[1]; //上
var right = rect[2]; //右
var bottom = rect[3]; //下
var width = right - left ; //横幅
var height = bottom - top; //縦幅
var center = [width / 2, height / 2];// 中心点を設定します
//アートボードの設定 ここまで
//円の作成 ここから
var circle = doc.pathItems.ellipse(center[1] + radius, center[0] - radius , 2 * radius, 2 * radius);// 円形を作成します
circle.note = "circle"; //属性
//円の作成 ここまで
//正面五角形の作成 ここから
pentagon(center[0] , center[1], "pentagon");// 5角形の関数pentagon(中心X , 中心Y, 属性)
//正面五角形の作成 ここまで
//正面五角形のパス座標値を求める ここから
for (var i = 0; i < doc.pathItems.length; i++){
if(doc.pathItems[i].note === "pentagon"){ //属性が一致
try{
doc.pathItems[i].selected = true; //オブジェクトの選択
}catch(e){};
}
}
var selObj = doc.selection; //選択中のオブジェクト
for( var i = 0; i < selObj.length; i++){//選択中のオブジェクト数だけ繰り返す
for( var j = 0; j < selObj[i].pathPoints.length; j++){//パスポイント数だけ繰り返す
var pathPoint = selObj[i].pathPoints[j];
var pathAnchor = [pathPoint.anchor[0],pathPoint.anchor[1]]; //anchor:[x,y]の順番で座標値を格納
pentagonPath.push(pathAnchor); //座標値を配置に追加
}
}
doc.selection = null; //選択解除
//正面五角形のパス座標値を求める ここまで
//周辺五角形の作成 ここから
var angles = [0, 72, 144, -144, -72];
for ( var i = 0; i < pentagonPath.length; i++){
pentagon(pentagonPath[i][0] -sin(shotSide, angles[i]), pentagonPath[i][1] + cos(shotSide, angles[i]) - pRadius,"satelight"); // 5角形の関数pentagon(中心X , 中心Y, 属性)
};
//周辺五角形の作成 ここまで
//五角形を回転 ここから
for (var i = 0; i < doc.pathItems.length; i++){
if(doc.pathItems[i].note === "satelight"){ //属性が一致
try{
doc.pathItems[i].selected = true; //オブジェクトの選択
}catch(e){};
}
}
var selObj = doc.selection; //選択中のオブジェクト
var angles = [108, 36, -36, -108, 180];
for ( var i = 0; i < selObj.length; i++){
resize(selObj[i]); //縦幅縮小
rotate (selObj[i], angles[i]); //回転
};
doc.selection = null;
//五角形を回転 ここまで
//六角形の線を作成 ここから
var halfWidth= selObj[2].width / 2;
var hypotenuse = Math.sqrt (Math.pow (halfWidth, 2) + Math.pow (longSide, 2)) // 斜辺を求める Math.sqrt:平方根を求める Math.pow:XのY乗
var angles = [[-24,-48], [-96,-120], [-168,-192], [-240,-264],[-312,-336]]
for ( var i = 0; i < angles.length; i++){
entirePath([center[0] + sin(hypotenuse, angles[i][0] ) ,center[1] + cos(hypotenuse, angles[i][0])],[center[0] + sin(hypotenuse, angles[i][1]) ,center[1] + cos(hypotenuse, angles[i][1])],"line");//entirePath(【スタートX,Y】、【エンドX,Y】、”属性”)
};
for( var i = 0; i < 360; i+=72){
entirePath([center[0] + sin(pRadius, -[i] ) ,center[1] + cos(pRadius, -[i]) ],[center[0] + sin( middleSide,-[i] ),center[1] + cos(middleSide,-[i])],"line"); //entirePath(【スタートX,Y】、【エンドX,Y】、”属性”)
};
//六角形の線を作成 ここまで
//クリッピングマスク ここから
for (var i = 0; i < doc.pathItems.length; i++){
if(doc.pathItems[i].note === "satelight"){ //属性が一致
try{
doc.pathItems[i].selected = true; //オブジェクトの選択
}catch(e){};
}
}
var selObj = doc.selection; //選択中のオブジェクト
for(var i = 0; i < selObj.length; i++){
selObj[i].move(clipObj,ElementPlacement.PLACEATBEGINNING); //グループ化 最後尾に追加する
}
doc.selection = null; //選択解除
var circle = clipObj.pathItems.ellipse(center[1] + radius, center[0] - radius , 2 * radius, 2 * radius) //円作成
circle.stroked = false; //線なし
clipObj.clipped = true; //クリッピングマスク
//クリッピングマスク ここまで
for (var i = 0; i < doc.pathItems.length; i++){
if(doc.pathItems[i].note === "circle"){ //属性が一致
try{
doc.pathItems[i].zOrder(ZOrderMethod.SENDTOBACK); // オブジェクトを最背面に移動
}catch(e){};
}
}
var selObj = doc.selection;
//5角形の関数 ここから
function pentagon(xPoint , yPoint, attribute){
var pentagon = doc.pathItems.polygon(xPoint, yPoint, pRadius, 5);// 5角形を作成します
pentagon.fillColor = setCMYKColor (0, 0, 0, 95);
pentagon.note = attribute; //属性
}
//5角形の関数 ここまで
//三角関数 ここから
function cos(side,angle){
return side * Math.cos(angle * (Math.PI / 180)); //コサインを三角関数で求める
}
function sin(side,angle){
return side * Math.sin(angle * (Math.PI / 180)); //サインを三角関数で求める
}
function tan(side,angle){
return side * Math.tan(angle * (Math.PI / 180)); //タンジェントを三角関数で求める
}
//三角関数 ここまで
//直線関数 ここから
function entirePath(start,end,attribute){
var line = doc.pathItems.add(); //パスアイテム追加
line.setEntirePath ([start,end]); //線:setEntirePath(始点[X座標、Y座標],終点[X座標、Y座標]])
line.note = attribute; //属性
}
//直線関数 ここまで
//オブジェクトの回転関数 ここから
function rotate(select, angle){
select.rotate (angle, true, false, false, false, Transformation.TOP);
}
//オブジェクトの回転関数 ここまで
//リサイズ関数 ここから.
function resize(select){
select.resize(100, 59.157, true, false, false ,false, false, Transformation.TOP);
}
//リサイズ関数 ここまで
//CMYKカラーの関数 ここから
function setCMYKColor(c,m,y,k){
var CMYK = new CMYKColor();//CMYKの初期化
CMYK.cyan = c;
CMYK.magenta = m;
CMYK.yellow = y;
CMYK.black = k;
return CMYK
}
//CMYKカラーの関数 ここまで
注意事項と免責事項
本記事に記載してあるスクリプトを実行した結果生じるトラブルに関しては一切の責任を負いません。ご利用は自己責任にてお願いいたします。
またIllustratorのアップデートにより動作が変わってしまう可能性もあります。アップデートによる動作の不具合に関しては、対処しかねるので予めご理解ください。
最後に本記事で配布しているスクリプトを無断で転送・販売・配布することは禁止いたします。
【サッカーボール】スクリプトのまとめ
この記事では、三角関数などを用いてサッカーボールの図形を作成するIllustratorスクリプトについて紹介してきました。
スクリプトのポイントをおさらいすると
・アートボード内を基準にする
・円と五角形を作成
・座標と角度を求めて回転させる
・クリッピングマスクで形を整える
このスクリプトを応用すれば雪の結晶や幾何学模様なども作成することが可能なので、ぜひこの記事を参考にしてIllustratorスクリプトの開発を始めてください
Illustratorスクリプトの基本や応用について学習したい方は次の記事で、オススメの書籍やWEBサイトを紹介しているので参考にしてください。
というわけで今回は以上です。
『【サンプル】Illustratorスクリプトを使ったサッカーボールの作成』を最後までお読みいただき、ありがとうございました。BE youeself...