土曜日, 10月 11, 2025

JavaScriptでAI遊び 73 
Illustratorで多角形の余分なポイントを削除

Illustratorでドット絵を作成していて[パスファインダー]>[合体]等で任意のオブジェクトを合体させると余分なアンカーポイントが出来てしまいます。そんな時は[オブジェクト]>[ラスタライズ]で画像に変換したから、[オブジェクト]>[画像トレース]>[カラー]等で調整すると余分なポイントのない形状を得ることが出来ますが、精度は期待できません。そこでScriptを作成してみました。処理はグループ化されていないことが条件です。

// ============================
// 多角形のコーナー以外のアンカーポイントを削除
// ============================
(function() {
if (app.documents.length === 0) {
alert("ドキュメントが開かれていません。");
return;
}

var doc = app.activeDocument;
if (doc.selection.length === 0) {
alert("パスオブジェクトを選択してください。");
return;
}

for (var i = 0; i < doc.selection.length; i++) {
var path = doc.selection[i];
if (path.typename !== "PathItem") continue;

var pts = path.pathPoints;
var removeList = [];

for (var j = 0; j < pts.length; j++) {
var prev = pts[(j - 1 + pts.length) % pts.length];
var curr = pts[j];
var next = pts[(j + 1) % pts.length];


// 3点が一直線上なら削除候補
if (isCollinear(prev.anchor, curr.anchor, next.anchor)) {
removeList.push(j);
}
}

// インデックスずれ防止のため逆順に削除
for (var k = removeList.length - 1; k >= 0; k--) {
pts[removeList[k]].remove();
}
}

alert("多角形のコーナー以外のアンカーポイントを削除しました。");

// ---- 関数群 ----

// 3点が一直線上にあるか(外積で判定)
function isCollinear(p1, p2, p3) {
var dx1 = p2[0] - p1[0];
var dy1 = p2[1] - p1[1];
var dx2 = p3[0] - p2[0];
var dy2 = p3[1] - p2[1];
return Math.abs(dx1 * dy2 - dy1 * dx2) < 0.001;
}

})();

18×22で396マスを色分けし、[選択]>[共通]>[カラー(塗り)]で同一色を選択後に[パスファインダー]>[合体]を実行します。

元データのポイント数:1584

コレで同一色だけが塊になしましたが、元のオブジェクトの数分余計なポイントが残って無駄にデータ量が多くになってしまいます。

同一色合体後のポイント数:798

そこでこのScriptを実行すると余分なポイントを削除出来ます。

余分なポイントを削除後のポイント数:78

鳶飛ぶに同一色がある場合は・・・

[パスファインダー]>[合体]を実行後に・・・

グループ解除してから、このScriptを実行すると余分なポイントを削除出来ます。