[Processing]円状隣接グラフを描いてみた
さきほどFlickrの
の画像をみて、「描きたいっ」と思って、Processingで描いてみました。「Circular Adjacency Graph」。「円状隣接グラフ」って勝手に呼んでいます。プログラム的にそういうことをしているので。全く同じものを作ったわけではないですが、自分の中では同じようなものなので満足しています。
※カーブ率 = 1のグラフ(クリックで別ウィンドウに原寸表示)
※カーブ率 = 0.3のグラフ(クリックで別ウィンドウに原寸表示)
Processing:
-
-
// 定数定義
-
-
// 変数定義
-
-
// 円周上に点を配置
-
points[i].setLocation(x, y);
-
// 色をランダムに定義
-
}
-
-
// 隣接行列を作成
-
}
-
}
-
}
-
-
// 円
-
// 点の配置
-
// 隣接点を結ぶ
-
// 隣接していなければ次へ
-
// 点を再定義(利便性)
-
// 2点間の距離を求める(2倍にして補間点を増やす)
-
int x21 = x2 - x1;
-
int y21 = y2 - y1;
-
// 進行度
-
float rate = k / r;
-
// 点の色を調整
-
// まずは2点を直線で結んだときの現在点を求める
-
// 重心の設定をするための比率(値域は0?curveRateまで)
-
// 円の中心と現在点に比率をかけて、描画点を求める
-
x = (x + cx * cRate) / (cRate + 1);
-
y = (y + cy * cRate) / (cRate + 1);
-
}
-
}
-
}
-
-
// 署名
円周上の点同士をline()命令を使って直線で結ぶのは簡単なのですが、上のFlickrの画像を見ると、中心に向かってカーブしています。これをどうやって再現するのかが悩みました。最初は円の中心と2点を結ぶ直線を漸近線とみたてて、双曲線を描こうとしたのですが、数式を調べたりそれを実装したりするのが面倒だと思って、即却下。代替案として、直線の個々の点と円の中心との重心をなぞる方法にしました。2点間の中心に近づくほど、円の中心に近づくようにサインカーブを調整しています。またカーブ率を低くすることで、重心を円周側に寄せられるので、なめらかなカーブになります。
いやぁーこんなのまで描けるんですね。楽しさ無限大!
