Skip to content

Instantly share code, notes, and snippets.

@shspage
Last active June 2, 2016 20:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shspage/0c9b5b83d48670802661d98a9a55a112 to your computer and use it in GitHub Desktop.
Save shspage/0c9b5b83d48670802661d98a9a55a112 to your computer and use it in GitHub Desktop.
Adobe Illustrator script that draws Delaunay diagrams - example (commented in Japanese)
//@include "~/ailib/delaunay.js"
// Adobe Illustrator script
// 選択範囲中のパスの中心の座標を元にドロネー図を描画します。
// 線は描かず、三角形の面のみを作成します。
// 描画した面はグループ化され、選択範囲中の最背面のオブジェクトの
// 背面に置かれます。
// 選択範囲中に複数のパスから成るグループがあった場合、それぞれの
// パスの中心座標を使用します。
// (元にしたパスはあとで削除しやすいようグループ化しているケース
//  が多いことを想定した処理です。)
// テスト環境: Illustrator CS3
// 作成: Hiroyuki Sato http://github.com/shspage
// ----
// 'delaunay.js' (by ironwallaby) を include しています。
// https://github.com/ironwallaby/delaunay
// ----
(function(){
// pageItem p の中心の座標 [x, y] を返します。
var getCenter = function(p){
var gb = p.geometricBounds; // left, top, right, bottom
return [(gb[0] + gb[2]) / 2, (gb[1] + gb[3]) / 2 ];
}
// 10~90% gray の GrayColor を生成して返します。
var getFillColor = function(){
var col = new GrayColor();
col.gray = Math.random() * 80 + 10;
return col;
}
// パスを生成して返します。
var createAPath = function(){
var p = app.activeDocument.activeLayer.pathItems.add();
p.closed = true;
p.filled = true;
p.stroked = false;
//p.fillColor = getFillColor();
return p;
}
// 実行できない状態の場合 true を返します。
var isBadCondition = function(){
if(app.documents.length < 1){
return true;
}
var adoc = app.activeDocument;
if(adoc.activeLayer.locked){
alert("アクティブレイヤーのロックを解除してください。");
return true;
}
return false;
}
// オブジェクトの配列 sel から pathItem を抽出して
// 配列 paths に入れます。
var getSelectedPaths = function(sel, paths){
for(var i = 0, iEnd = sel.length; i < iEnd; i++){
if(sel[i].typename == "PathItem"){
paths.push(sel[i]);
} else if(sel[i].typename == "GroupItem"){
getSelectedPaths(sel[i].pageItems, paths);
} else if(sel[i].typename == "CompoundPathItem"){
getSelectedPaths(sel[i].pathItems, paths);
}
}
}
// 最背面のオブジェクトを返します。
var getBackmostObject = function(sel){
return sel[sel.length - 1];
}
// メイン処理
var main = function(){
if(isBadCondition()) return;
var adoc = app.activeDocument;
var paths = [];
var sel = adoc.selection;
if(sel.length > 0){
// あとで選択物の背面に描画するため、選択物中の最背面の物を取得。
var backmost = getBackmostObject(sel);
getSelectedPaths(sel, paths);
}
if(paths.length < 3){
alert("3つ以上のパスを選択してください。");
return;
}
var vertices = [];
for(var i = 0, iEnd = paths.length; i < iEnd; i++){
vertices.push(getCenter(paths[i]));
}
// 戻り値は vertices の index の配列です。
// 3つずつ順に取り出して三角形の頂点として使います。
var idxs = Delaunay.triangulate(vertices);
// アートボードへの描画
// 描画した三角形はグループ化されています。
var gr = adoc.activeLayer.groupItems.add();
gr.move(backmost, ElementPlacement.PLACEAFTER);
var p = createAPath();
p.move(gr, ElementPlacement.PLACEATEND);
for(var i = 0, iEnd = idxs.length; i < iEnd; i+=3){
var triangle = p.duplicate();
// 塗り色を設定
triangle.fillColor = getFillColor();
triangle.setEntirePath([vertices[idxs[i]],
vertices[idxs[i + 1]],
vertices[idxs[i + 2]]]);
}
p.remove();
}
main();
})();
// 2016.06.03 - getBackmostObjectを変更
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment