ねこでじ(Nekodigi)

Nekodigi’s diary

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

【Processing】Hyperbolic Tilingを実装する。

成果物

Animation

www.youtube.com
Hyperbolic Plane上(Poincare Disk上)に、正多角形を敷き詰めることができました。正p角形をq個隣接するように並べる場合、平面上では(p-2)(q-2)=4になりますが、Hyperbolic Plane上に敷き詰める時は(p-2)(q-2)>4になります。

仕組み

今回はこちらのTutorialを参考にして作成しました。
www.youtube.com
ただ、どこが何に対応しているのか分かりにくかったので、Processingを使って視覚化してみることにしました。

Visualization1

www.youtube.com
大まかには、普通の多角形を中心に作成し、Mobius Transformを使い、鏡に映していくようにPoincare Disk上でどんな形になるのかを求めています。
まず、中心、Poincare Disk上の点を渡して、hypCircleと書いてある二つの円を作成します。そして、その二つの円の交点を求めます。交点の一つをPoincare Diskを中心にMobius Transformで変換してinvipを求めます。そして、二つの交点とinvPを通る円を求めます。この円を中心に普通の多角形にMobius Transformをかけると、Poincare Disk上での多角形の頂点の位置がわかります。Poincare Diskを中心に先ほどの頂点にMobius Transformをかけると、カーブしている辺を計算するために後で使う、invposが求められます。

Visualization2

www.youtube.com
2つの頂点と対応するinvposを通る円の一部が、多角形の辺になります。

Tiling

Tutorialでは、先に辺を求めていました。しかし、距離でマージや環状になっている辺に面を張る部分は、コードが複雑になってしまいそうなので、一番最初にベースの多角形を作っておき、それを毎回転写するという方法をとっています。転写は意外と簡単で、辺(弧)を選んで、その弧のもとになっている円を中心に、全ての辺をMobius Transformにかけると完了です。重複を削除すればさらに良いのですが、今回は行っていません。

コード

こちらのリポジトリにHyperbolic Tilingという名前で追加しています。
仕組みを視覚化したものは、Mechanism of Hyperbolic Tilingという名前で追加しています。
github.com