木曜日, 10月 02, 2025
水曜日, 10月 01, 2025
JavaScriptでAI遊び 71
Illustratorでオブジェクトの面積を求める
Illustratorでオブジェクトの面積を求めます。ただし曲線を含む場合はラフな結果になりますが、後述する様にアンカーポイントを増やすことで対処できます。
function getClosedPathArea(path) {
if (!path.closed) return 0;
var points = path.pathPoints;
var n = points.length;
var area = 0;
// 多角形の面積公式(Shoelace formula/靴紐公式)
// 公式はソースの最後を参照
// クローズパス内の 各アンカーポイントを順に処理
// n はアンカーポイントの数
// p1 は現在の点の座標(例:A点)
// p2 は次の点の座標(例:B点)
// % n にすることで 最後の点から最初の点へ繋がり
// 閉じた形(ループ)になる
for (var i = 0; i < n; i++) {
var p1 = points[i].anchor;
// 多角形の面積公式のコア部分
// 面積=1/2Σ(Xi/・
// p1[0] は X 座標、p1[1] は Y 座標
// 一辺ずつ順に計算して全て合計
var p2 = points[(i + 1) % n].anchor;
//
area += (p1[0] * p2[1]) - (p2[0] * p1[1]);
}
// 最後に絶対値を取り 1/2 にして面積として返す
// Math.abs は、パスが時計回り or
// 反時計回りどちらでも正の面積にするため
return Math.abs(area / 2);
}
// 曲線の精度は、アンカーポイントを参照するので
// 大まかな面積になります。
// 正確な面積を求める場合は
// アウトライン化後に分割数を増やす必要があります。
function main() {
if (app.documents.length ==
0 || app.activeDocument.selection.length == 0) {
alert("オブジェクトを選択してください。");
return;
}
var sel = app.activeDocument.selection;
var totalArea = 0;
var count = 0;
// sel は現在の選択オブジェクトの配列
//(app.activeDocument.selection で取得)
// sel.length は選択されたオブジェクトの数
// i を 0 から順に回して、すべての選択オブジェクトを1つずつ処理
for (var i = 0; i < sel.length; i++) {
// パス(PathItem)かつ閉じたパスであること
if (sel[i].typename === "PathItem" && sel[i].closed) {
// 該当パスの面積を求める関数 getClosedPathArea() を
// 呼び出して合計面積に加算
totalArea += getClosedPathArea(sel[i]);
count++;
}
}
if (count === 0) {
alert("クローズパスが選択されていません。");
} else {
// Illustrator では 1pt ≒ 0.35278 mm
var areaMM2 = totalArea * Math.pow(0.35278, 2);
// pt² → mm²
alert("選択されたクローズパス " + count + " 個の合計面積:\n" +
areaMM2.toFixed(2) + " mm²");
}
}
main();
実行後、直ぐに結果が表示されます。
直径50mmの円を作成して実験してみました。円の面積は[πr2乗]なので、計算すると
25×25×3.14=1962.50
となります。これを今回のScriptで解散すると、ポイント追加を4回or5回は実行しないと正確ではないことが解ります。ちなみに作成した円のハンドルを全て取り去ると、一辺が35.355mmの正方形になります。計算すると
35.355×35.355×3.14=1249.98
結果を表に纏めてみました。
ラベル:
Illustrator,
JavaScript
登録:
投稿 (Atom)