水曜日, 7月 02, 2025

JavaScriptでAI遊び 53 
Illustratorで矩形オブジェクトをランダム分割

選択した矩形オブジェクトをランダムに分割してみます。

function randomSplitRectangles() {

if (app.documents.length === 0) {
alert("ドキュメントがありません。");
return;
}

var doc = app.activeDocument;

if (doc.selection.length !== 1) {
alert("矩形を1つ選択してください。");
return;
}

var obj = doc.selection[0];

if (obj.typename != "PathItem") {
alert("PathItemを選択してください。");
return;
}

var count = parseInt(prompt("最終的な矩形数", "10"), 10);

if (isNaN(count) || count < 2) {
alert("2以上を入力してください。");
return;
}

// 元矩形
var b = obj.geometricBounds;

var rects = [];

rects.push({
left:b[0],
top:b[1],
right:b[2],
bottom:b[3]
});

// 元オブジェクトのスタイルを保存
var srcFilled = obj.filled;
var srcFillColor = obj.fillColor;

var srcStroked = obj.stroked;
var srcStrokeColor = obj.strokeColor;
var srcStrokeWidth = obj.strokeWidth;

obj.remove();

while(rects.length < count){

// 面積最大の矩形を探す
var index = 0;
var maxArea = 0;

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

var w = rects[i].right-rects[i].left;
var h = rects[i].top-rects[i].bottom;
var area = w*h;

if(area>maxArea){
maxArea=area;
index=i;
}
}

var r = rects[index];

var w = r.right-r.left;
var h = r.top-r.bottom;

// 小さすぎる場合は終了
if(w<8 || h<8) break;

var vertical = (Math.random()<0.5);

if(vertical){

var x = r.left + w*(0.3+Math.random()*0.4);

rects.splice(index,1);

rects.push({
left:r.left,
top:r.top,
right:x,
bottom:r.bottom
});

rects.push({
left:x,
top:r.top,
right:r.right,
bottom:r.bottom
});

}else{

var y = r.bottom + h*(0.3+Math.random()*0.4);

rects.splice(index,1);

rects.push({
left:r.left,
top:r.top,
right:r.right,
bottom:y
});

rects.push({
left:r.left,
top:y,
right:r.right,
bottom:r.bottom
});
}

}

// 描画
for(var i=0;i<rects.length;i++){

var r=rects[i];

var p = doc.pathItems.rectangle(
r.top,
r.left,
r.right-r.left,
r.top-r.bottom
);

// 元オブジェクトのスタイルをコピー
p.filled = srcFilled;
if (srcFilled) {
p.fillColor = srcFillColor;
}

p.stroked = srcStroked;
if (srcStroked) {
p.strokeColor = srcStrokeColor;
p.strokeWidth = srcStrokeWidth;
}
}

}

randomSplitRectangles();

ベースにした矩形

デフォルトの分割数10を実行すると・・・

分割数10の結果

分割数30を実行すると・・・

分割数30の結果

2026/07/06 修正

※Illustratorのアップデートで不具合が出る場合があります。気がついた時点でデバッグするように心がけていますが、すぐに対応できないのでご容赦ください。