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






