AIのJavascript ―演算なしでパスの交点を抽出―

最終更新日

Comments: 3

で、つぶやいたの貼っておきます。何かと言うと、ジオメトリ演算皆無の交点検出スクリプトです。コンセプトコードですので、実際の運用には例外処理が必要です。アンカーポイントで交差している場合とか…

こちらがコードです。

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

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする