月曜日, 10月 06, 2025

JavaScriptでAI遊び 72 
Illustratorで曲線の長さを求める

クローズドパス(※)やガイド、クリッピングパスなどは無視します。
「カーブを直線にしたときの長さ(アンカー間)」です。
ベジェ曲線そのものの長さではありません。

※一箇所に切り込みを入れて見かけ上はクローズドパスでも実質オープンパスにすれば処理可能です。

if (app.documents.length ===
        0 || app.activeDocument.selection.length === 0) {
alert("オープンパスを1つ以上選択してください。");
} else {
var doc = app.activeDocument;
var sel = doc.selection;
var ptToMm = 0.35278; // 1ポイント = 約0.35278mm

// オープンパス(!item.closed)のみ対象
for (var i = 0; i < sel.length; i++) {
var item = sel[i];
if (item.typename === "PathItem" && !item.closed) {
var points = item.pathPoints;
var total = 0;

// アンカーポイントの anchor 同士の距離を
            // √(dx² + dy²) で算出
for (var j = 0; j < points.length - 1; j++) {
var pt1 = points[j].anchor;
var pt2 = points[j + 1].anchor;
var dx = pt2[0] - pt1[0];
var dy = pt2[1] - pt1[1];
total += Math.sqrt(dx * dx + dy * dy);
}

// Illustrator の単位である ポイント(pt)を
            // ミリメートル(mm)に換算
var lengthMM = total * ptToMm;
alert("オープンパス " + (i + 1) +
                " の直線化した長さ: " + lengthMM.toFixed(2) + " mm");
}
}
}

直径80mmの円を作成します。円周は251.20mmになりますが、左端のアンカーポイントをハサミツールで切り込だ状態では226.28mmとなりました。

アンカーポイントを追加を1回実行して処理すると・・・
244.92mmとなりました。

アンカーポイントを追加を2回実行して処理すると・・・
249.75mmとなりました。

アンカーポイントを追加を3回実行して処理すると・・・
250.96mmとなりました。

ちなみに、アンカーポイントを追加を4回実行して処理すると・・・
251.26mmとなり、結果オーバとなりましたました。正確な値を求める訳ではな区、あくまでも目安なのでアンカーポイントを追加は3回あたりが妥当ですね。