AIのJavascript ―演算なしでパスの交点を抽出―
で、つぶやいたの貼っておきます。何かと言うと、ジオメトリ演算皆無の交点検出スクリプトです。コンセプトコードですので、実際の運用には例外処理が必要です。アンカーポイントで交差している場合とか…
こちらがコードです。
var pt = [];
var rslt = [];
var tg = app.selection;
var i,j;
for (j=0;j<2;j++){
for (i=0;i<app.selection[j].pathPoints.length;i++){
pt.push(app.selection[j].pathPoints[i].anchor);
}
}
var gp = app.activeDocument.groupItems.add();
tg[0].duplicate(gp,ElementPlacement.PLACEATEND);
tg[1].duplicate(gp,ElementPlacement.PLACEATEND);
gp.selected = true;
app.executeMenuCommand("Live Pathfinder Add");
app.executeMenuCommand('expandStyle');
for (i=0;i<app.selection[0].pathItems[0].pathPoints.length;i++){
rslt.push(app.selection[0].pathItems[0].pathPoints[i].anchor);
}
for (i=0;i<pt.length;i++) {
for (j=0;j<rslt.length;j++){
if (pointDiff (pt[i], rslt[j])){
rslt.splice(j, 1);
break;
}
}
}
if (rslt.length>0) {
var pth = app.activeDocument.pathItems.add();
var pts;
for (i=0;i<rslt.length;i++) {
pts = pth.pathPoints.add();
pts.anchor = rslt[i];
pts.leftDirection = rslt[i];
pts.rightDirection = rslt[i];
}
}
app.selection[0].remove();
function pointDiff (a,b){
if (a[0]==b[0]&&a[1]==b[1]) return true;
return false;
}
ご覧のとおりです。先日のパスファインダースクリプトがベースになります。事前にunionかけるpathItemのpathPointのanchorを全て配列に収容しておき、union後のpathPointのanchorと比較し、新たに生成されたポイントをチェックします。この新しいアンカーポイントが交点となります。
この例では検出した交点を線分で接続してみました。例外処理を含む実用的なのはそのうちにwww