[AI]世界一単純な図形交差検出関数
Illustratorに限らずオブジェクトの重なりの判断というのは2次元空間内における座標を取得して曲線ならバーンスタインがどうとかこうとか演算が必須となっております。おそらくみんな泣きながらやればある程度のものは出来るんじゃないかなぁって思うのです。
しかしながら、一言申し添えると「面倒くさい」です。こんなん、手早く書き捨てたいと思うぐらいものなんですけどそうも行かないのが世の常なのです。で、今回はその圧倒的に面倒くさい部分を全てショートカットする仕組みを提供いたします。
話はとても単純です。2つのパスオブジェクトをパスファインダー処理します。重なりがない場合は処理前後でそれらのパスが成す面積は変化しません。重なっている場合、その重なった部分の面積分だけ総面積から減少するわけです。これを見て2つのパスオブジェクトが重なるかどうかを判断します。
function intersectChecker(tg){
if (tg.length!=2) return null;
if (app.selection[0].typename!="PathItem"
||app.selection[1].typename!="PathItem") return null;
var ar1 = tg[0].area + tg[1].area;
app.executeMenuCommand('copy');
app.executeMenuCommand('pasteFront');
app.executeMenuCommand('group');
app.executeMenuCommand('Live Pathfinder Intersect');
app.executeMenuCommand('expandStyle');
for (var ar2=0, i=0;i<app.selection[0].pathItems.length;i++)
ar2 += app.selection[0].pathItems[i].area;
app.selection[0].remove();
tg[1].selected = true;
tg[0].selected = true;
if (ar1==ar2) return false;
else return true;
}
intersectChecker(app.selection);
上に示すようにコード自体は手作業を模倣するような構成としました。コピー→前面へペースト→グループ→効果/パスファインダー/交差→アピアランスを分割までがワンセットです。この作業の前後で各オブジェクトの面積を利用して交差を判断します。ファンクション自体は交差している場合はtrueを、交差していない場合はfalseを、それ以外の選択がおかしい場合はnullを返します。
しかし、この関数は面積を持たない図形には効果がありません。線同士とか線と図形の交差などのケースですが方法が無いわけではありません。ヒントだけ出しておきますが、極細線にしてパスのアウトラインを取ってしまえば…