しばらく前の Template error の話の時に作っていたものは,Sierpinski の tetrahedron である.http://en.wikipedia.org/wiki/Sierpinski_triangle
やっと今日プログラムが動いた.
このために今回は OpenMesh (http://www.openmesh.org
) という mesh をちょっと使ってみようと思って挑戦してみた.自分で作ったメッシュライブラリもあるが,結局私の場合には問題を解くのが主眼なので,良い FreeSoft があるならば,そっちを使う方がメッシュそのものをデバッグする必要がないだろうから良いと思う.
図 1 は OpenMesh でどのように Tetrahedron の頂点をconsistent
に取得するかを示している.consistent に頂点を取得するという意味は,図1 の上図のO_{0,1,2,3}
となるように頂点を得るにはどうするかということである.たとえば,Tetrahedron の 4つの頂点をとれたとしても,上図で O_1 と
O_3 が入れ変わっているような状況では Sierpinski の tetrahedron を作るのに都合が悪い.
実は私は本来これをどのようにべきかは知らないが,OpenMesh の mesh circulator が face から halfedge への対応を教えてくれるので,これに依存することにした.おそらくこれで良いと思うが.もっと良い方法があればcomment 下さい.ただし,入力が Tetrahedron なのかを最初に調べる必要がある.これも次のように circulator を使う.
1. 一つ面 f0 を選ぶ.
2. f0 の 1-ring neighbor の面を face face circulator で取得する.f0 と合わせて 4 つの面 (f0, f1, f2, f3) が得られる.もし,得られなかった場合には境界があったことになるが,Tetrahedron には境界はないので,これは tetrahedron ではない.
3. 全ての {f0, f1, f2, f3} についてその 1-ring neighbor がこの 4つのいずれかかを調べる.もし知らない face があればこれは tetrahedron ではない.(実際には f1, f2, f3 は f0 の circulator で得られたので,f0 に関しては調べる必要はない.)
consistent な頂点リストが得られれば,あとば,図 2 と図 3のルールを使って Siepenski の Tetrahedron を作成することができる.結果を OpenGL でrendering すると,以下の図のようになる.特に新しいわけでも,難しいものでもないのだが,久しぶりに mesh の program を書いて楽しかった.