ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】Lloyds Algorithmを使って、平面と球面上で、泡が広がっていくようなアニメーションを作る。

成果物

平面

www.youtube.com
Lloyds algorithmは、繰り返していくと、均一に広がっていくアルゴリズムでVoronoi Iteration / Relaxationともいわれます。重心を求めることができればよいので、簡単に球面にも拡張できます。

仕組み

ボロノイ図の内側の頂点をボロノイ図の重心に移動させていく処理を繰り返すと均一に広がっていきます。ボロノイ図の内側の頂点は、作成するときにもとにしたドロネー分割の頂点をそのまま指定すれば大丈夫です。また、Voronoi図のセルを生成するたびに色が変わらないように、頂点そのものに色を設定し、多角形に反映しています。

平面

マウスの位置に大量の頂点を配置しています。ただ、乱数の範囲を変えるとなぜかエラーが起きたので、オフセットと範囲を変更することで同じ処理をしています。頂点を範囲内に収めておかないと非常に大きい数値に発散してエラーが出るので注意です。重心の位置を求めるプログラムはこちらを参考にしました。stackoverflow.com

球面

Sphere Samplingという数式で、上部に偏って出現させています。
nekodigi.hatenablog.com
先ほどの重心の計算式は球面上では使えないので、全頂点の平均を使って近似的に求めています。球面だということや、重心を近似的に求めているということもあり、全ての頂点が片側に固まってしまわないようにする必要があります。また、移動した後も球面上に来るように、位置ベクトルの大きさを毎回指定する必要があります。

コード

Voronoi Relaxationという名前で追加しています。mキーで平面と球面が切り替わります。
github.com