◆ polyhed開発の歴史、その1です
● 一様多面体の表示 (Vertex / Vortex)
「多面体の模型」という本を手に入れ、一様多面体なるものが楽しそう、と思ったので、当時の非力なパソコン(8bit機)で何とか表示できるように作ったプログラムがありました。それが、polyhedのソースプログラム(polyhed.cpp)の中に盛んに出てくる、VertexとVortexと呼ばれるプログラムでした。
…でした、と過去形なのは、今、その痕跡すら残っていないからです。なので、若干うろ覚えです。
「多面体の模型」は色紙での表面模型の作り方が書かれた本です。しかし、紙を切ったり折ったりするときに座標計算が必要なので、計算に関するデータが満載されています。その一つが、頂点周りのイラストです。
アイデアは、「一つの頂点周りから計算機に試行錯誤させて、立体の全頂点とその結びつきが計算できないか」ということです。模型の写真をしばらく眺めているうちに、2つの戦略を思いつきました。
▼ Vertex。対称一様多面体の表示
ある頂点と、それに辺(稜)で隣接する頂点の座標が計算できていたと仮定します。
ある辺の中点に垂直な面を想定します。その面を鏡と考え、他の全ての頂点の鏡像を計算します。各辺も鏡像の位置にコピーします。この手順を次々に繰り返すと、ついに新たな点や辺が生成されなくなります。その時には、多面体が計算機の中で完成している、ということです。
操作から、明らかに、左右対称の立体しか生成されません。しかし幸い、一様多面体の主流は左右対称の立体です。まずはここから始めよう、と考えました。
辺の長さを1に固定し、ある頂点をz軸上において(0<高さ<1)、辺を隔てた隣の全頂点をxy平面に置きます。ちょうど、骨だけになった西洋傘の感じです。隣り合う骨が、三角形などの一つの頂点の角に相当します。頂点周りのイラストから多角形の並び順は分かりますから、最初の頂点のz軸上の高さが分かれば、全座標が計算できます。
たとえば、正四面体ですと、一つの頂点に正三角形が3枚集まっています、ですから、互いに60度の角度の3本の骨からなります。立方体なら正方形が3枚、正二十面体なら正三角形が5枚です。半正多面体は三角・四角・三角・四角などと、二種以上の多角形が混じります。しかし、どの頂点をとっても同じ順序です(方向は隣接する頂点で右回りと左回りの逆になります)。
さて、そのz軸上の高さは「多面体の模型」に、直接ではありませんが、記述されています。しかし、いろんな可能性を試したかったので、頂点周りの多角形の配置から計算機に探索させることにしました。なお、いくつかの一様多面体では、追加のデータを与えないと、骨だけの傘が図形として安定しないので計算できません。
さて、頂点と辺は計算できましたが、苦労したのは表示です。polyhedではOpenGLという飛び道具が利用できましたが、当時は隠れ線処理も自分でプログラムしないといけません。試行錯誤の末、やっとの思いでプリンタに出力させたことを思い出します。
しかし、その出力には何時間もかかりますし、見る方向は一つなので、他の視点を指定しても出力は数時間後です。
ということで、強力な計算機が手に入るまでお預け状態になってしまいました。
▼ Vortex。捩れ一様多面体の表示
正多面体には左右対称の図形しかありません(実を言うと、正二十面体は捩れ多面体としても解釈可能です)。しかし、アルキメデスの立体の中には、2種の捩れた多面体、すなわち変形立方体と変形十二面体があります。一様多面体には、凸でない変形多面体が10種あります。
さて、じっと変形多面体の写真をながめていると、最後の変形一様多面体を除けば、余分な正三角形(「変形3角形」のことです)があることに気づきます。しかも決まって各頂点に3枚の正三角形が出現します。二角形を認めることにすると、変形多面体の各頂点には6枚の正多角形が集まっていて、一つ置きに正三角形が配置されています。
さらにじ〜っと見つめていると、余剰の正三角形以外の正多角形の中心を軸として渦を巻くように、立体は回転対称になっています。そこで、この感覚をアルゴリズムにしてみました。
つまり、頂点周りで余剰の正三角形の角をとりあえず飛ばして、のこりの正多角形の中心を軸に回転操作を行い、回転後の頂点と辺を計算してゆきます。これを計算機に試行錯誤させると、ついに新たな頂点や辺が生まれなくなります。その時点で立体が完成していることになります。なお、二角形の中心に垂直な直線、というのは数学的に計算できないので、立体の中心とを結ぶ線で180度回転させます。
計算機の中で渦が巻いているように思えたので、このアルゴリズムによるプログラムをvortexと呼ぶことにしました。先の左右対称の立体のプログラムは、語呂を合わせてvertexと呼ぶことにしました。
polyhedでは対称図形の計算部分にvertex、捩れ図形の計算部分にvortexと名づけて私的に連想しやすいように関数命名しています。アルゴリズム的には無関係です。
▼ その後のVertexとVortex
結局、VertexとVortexは一応動かした記憶がありますが、物にはなりませんでした。その後関心はシュワルツ三角に移ってしまい、VertexやVortexのような強引なアルゴリズムは記憶の片隅で休んでいたことになります。その理由は、
一様多面体の探索には、もはやほとんど役立たない
何かが発見できたとしても、何が起こったか説明が困難。つまり発展性が無い
頂点周りの計算で余分なデータが必要、というのは不自然に思えた。つまり理論的にも限界がある
などだと思います。
皮肉なことに、polyhedではvortexアルゴリズムが一部で使用されています。
最後の一様多面体、ウェニンガーの番号で119番はシュワルツ三角とは関係の無い変形一様多面体です。余剰の3つの正三角形ではなく、余剰の4つの正方形が各頂点に配置されています。
その昔、Vortexの開発中に、No.119多面体にもvortexアルゴリズムが通用するのを見落としたのは、痛恨です。
polyhedが見ていて楽しいだけでなく、案外強力なのに気づいたため、何とか119番多面体も表示したいとあれこれ考えてゆくうちに、ひょっとしたらvertexかvortexアルゴリズムががんばってくれるのではないか、少なくとも形は作ってくれるだろう、と思えてきました。一応変形多面体という触れ込みなので、まずはvortexアルゴリズムから試してみることにしました。やってみると、何と、きわめて美しく色分けされた立体が現れたではありませんか。
polyhedを起動し、カタログウィンドウ最後の119番多面体を表示させてみてください。おそらく、ここでしか見られない色分けがされ、渦を巻いているように見える、最後の一様多面体が姿を現します。
No.119 大2重斜方20・12面体
2002年7月27日 岡田好一