土曜日, 5月 16, 2026

JavaScriptでAI遊び 92 
Illustratorでオブジェクトのアンカーポイントを均一に

イラレでクローズパスのオブジェクトののアンカーポイントを均一にします。ただし処理後はハンドルは生成しません。難しい(^o^)汗


(function () {

var doc = app.activeDocument;
var sel = doc.selection;

if (!sel.length) {
alert("オブジェクトを選択してください");
return;
}

var targetCount = Number(prompt("アンカーポイント数", 30));
if (!targetCount || targetCount < 3) return;

var DIV = 20; // ← 曲線分割精度(大きいほど滑らか)

function bezier(p0, p1, p2, p3, t) {
var mt = 1 - t;
return [
mt*mt*mt*p0[0] + 3*mt*mt*t*p1[0] +
                3*mt*t*t*p2[0] + t*t*t*p3[0],
mt*mt*mt*p0[1] + 3*mt*mt*t*p1[1] +
                3*mt*t*t*p2[1] + t*t*t*p3[1]
];
}

for (var i = 0; i < sel.length; i++) {

if (sel[i].typename !== "PathItem") continue;
var path = sel[i];
if (!path.closed) continue;

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

// ベジェを細かく分割
for (var j = 0; j < pts.length; j++) {

var p0 = pts[j].anchor;
var p1 = pts[j].rightDirection;
var next = pts[(j+1) % pts.length];
var p2 = next.leftDirection;
var p3 = next.anchor;

for (var k = 0; k < DIV; k++) {
var t = k / DIV;
sampled.push(bezier(p0, p1, p2, p3, t));
}
}

// 閉じる
sampled.push(sampled[0]);

// 長さの計算
var lengths = [];
var total = 0;

for (var j = 0; j < sampled.length - 1; j++) {
var dx = sampled[j+1][0] - sampled[j][0];
var dy = sampled[j+1][1] - sampled[j][1];
var len = Math.sqrt(dx*dx + dy*dy);
lengths.push(len);
total += len;
}

var step = total / targetCount;

var newPts = [];
var acc = 0;
var seg = 0;

for (var n = 0; n < targetCount; n++) {

var target = n * step;

while (acc + lengths[seg] < target) {
acc += lengths[seg];
seg++;
}

var remain = target - acc;
var r = remain / lengths[seg];

var pA = sampled[seg];
var pB = sampled[seg+1];

var x = pA[0] + (pB[0] - pA[0]) * r;
var y = pA[1] + (pB[1] - pA[1]) * r;

newPts.push([x, y]);
}

// 新規パス作成
var newPath = doc.pathItems.add();
newPath.setEntirePath(newPts);
newPath.closed = true;
newPath.stroked = true;
newPath.filled = false;

path.remove();
}

})(); 

オブジェクトを洗濯して実行すると・・・

デフォルトの設定値30が表示されまっす。そのまま[OK]で・・・

30個のアンカーポイントを均一配置した結果になります。

少なく設定すれば・・・

こんな感じです。
カーブを保つのは今後の課題です(^o^)汗