2012年7月22日日曜日

Life Game

広い空間と長い時間を使えば, Life Gameで計算機がシミュレート出来るという話は聞くが, そう簡単には納得できない.

Winning Waysを読んでいたら, 記憶装置の実現法が書いてあった. こういう方式らしい.

A, B, C, などが記憶場所で, その上方にブロックを置き, そのブロックまでの距離を記憶している値とする. 従って書き込むにはその数値の分だけブロックを遠ざける手続きを繰り返す. また読み出すにはブロックを近づけ, 0になるまでの回数で知る.

近づけたり塔ざけたりには, いつものようにグライダーを使う. 上の図の縦方向は, 実はグライダーの飛ぶ斜め方向である.

ブロックを近づける方法はこうだ.



左上からA, B2機のグライダーがブロックに近づく. この図をクロック0としよう. 目的はブロックを左上へ動かすことである.

その後, クロック10になると, ブロックに衝突したAがブロックを少し移動して下の図になる.



ブロックの元の位置は赤い枠で示したとおりで, 左へ2, 上へ1移動した. 左と上の距離が違うので, もう一度Bをブロックに衝突させる. その結果が次の図だ. (クロック18)



ブロックの位置は, 上へも左へも3移動した.

一方, ブロックを遠ざけるのは簡単ではない.



上の図(クロック0)では, グライダーは左下から右上へ向かっている. 従ってブロックを右上に動かしたい.

グライダーは10機描いてあるが, 2つの編隊になっている. 第1編隊はA, B, C, D, Eで, 最初にブロックに近づくAのミッションは, ブロックに衝突し, 蜂の巣(beehive)4個からなる養蜂場(bee farm)の形にすることだ.

下がクロック24で, Aの衝突の結果, 養蜂場になったところである.



そこへ近づくB, C, Dの3機のミッションは, それぞれ下, 右, 左の蜂の巣と消滅衝突をすることである. 最後のEが近づき, 上に残った蜂の巣に衝突し, ブロックにする.

クロック77になると, 衝突が治まり, ブロックになるが, 赤い枠の元の位置からは左へ1, 上へ2移動した.



すぐ近くに第2編隊のF, G, H, I, Jが接近している. これらは前の編隊とは左下から右上に掛けての45度の線について対称である. Fが養蜂場を作り, G, H, Iが余分の蜂の巣を片付け, 最後にJがブロックに戻す. (164クロック)



これでブロックは右上に(1,1)だけ移動した. しかし先に書いた近づける方は(3,3)だけ移動したので, 遠ざける方は同じことをあと2回やらなければならない. つまり30機をもって押し返すという筋書きである.

ところで, 遠ざける方の最初の図だが, Winning Ways第4巻953ページにある図は, シミュレートしてみると, うまく行かないのである. いろいろテストしてみて, CとEを元の図より1ピクセル下へ, HとJは1ピクセル左へ移動してある. これならうまくいくことがシミュレーションで確認してある.

2012年7月21日土曜日

多面体描画道楽

星形正多面体描画はまだ「大二十面体」が残っていた. (「大二十面体」からは子供の頃読んだ「怪人二十面相」を連想してしまう. でも内容はもう覚えていない.)

一松先生に記述はこうだ「正二十面体の各面に対し, 各辺に隣る三角形の頂点3個を結ぶ正三角形20個を面にとります.」 相変わらず簡潔だ. 面は20, 辺は3×20÷2=30, 頂点は3×20÷5=12. 後に判明するように, 頂点で面は星形(5/2角形)で交わるから, Schläfliの記号は{3,5/2}. いやはや記述とは反対に大変な難物であった.

前回のブログにあった枠になる正二十面体の図をもう一度示すと. つまり頂点0,1,2の面に対しては, それに隣る三角形の頂点5,10,3の三角形で, こういう面だけで出来る立体はそう容易には想像出来ない. 数学者の想像力にはいつもながら脱帽だ. かなりの日時をかけ, 苦心惨憺, 紆余曲折, といいつつも十分楽しんだ末, 出来た図はこれだ. 自画自賛すれば実にもっともらしい. たしかに頂点5,10,3を結ぶ三角形は見える. 下は左が正二十面体の面, 右がそれに対応する大きい三角形である.
[2 1 0]   [10 5 3]
[3 2 0]   [11 1 4]
[4 3 0]   [7 2 5]
[5 4 0]   [8 3 1]
[1 5 0]   [9 4 2]
[2 10 1]  [11 9 0]
[11 10 2] [6 1 3]
[3 11 2]  [7 10 0]
[7 11 3]  [6 2 4]
[4 7 3]   [8 11 0]
[8 7 4]   [6 3 5]
[5 8 4]   [9 7 0]
[9 8 5]   [6 4 1]
[1 9 5]   [10 8 0]
[10 9 1]  [6 5 2]
[7 8 6]   [4 9 11]
[8 9 6]   [5 10 7]
[9 10 6]  [1 11 8]
[10 11 6] [2 7 9]
[11 7 6]  [3 8 10]
ためつすがめつ眺めているうちに, これは下の図のオレンジ色の正五角形の上に, 背の高い星形が乗っている; その正五角形が芯になる正十二面体であるらしいと分かって来た. しかし頂点3に関わる部分だけで三角形は15もある. 都合180個の三角形の座標を計算しなければならぬ. 当然その計算の部分はSchemeで別にやることにした.

星形の底面の凸の点は, 例えばAは頂点3と5の線上にあるから, 後で計算出来るとして, 凹の点Bはどうするか. 頂点3からの三角形の辺は, 8,5,1,10,6に向かい, それらの頂点は8,1,6,5,10の順に星形(5/2角形)につながっている.

ABの線は頂点5, 10の線と平行であり, BCの線は頂点8, 1の線と平行なので, その交点の座標を知る必要がある. このような交点を5個計算し, 3と5の位置を内分してAが得られたように, 3と交点を同じ比で内分するとBが得られるわけだ. この比は1:(1+√5)/2なので, 黄金分割であった.

180個のすべての三角形の頂点の座標が得られてから, それらの各点の視線方向の距離を計算し, 遠い物から順に描くと最初の図が出来た.

一応目的は達成したが, こういう水の溜まる立体を白地で示すと, どこが凸でどこが凹かが分かりにくい. 次は面を濃淡に塗り分けてみたい.

2012年7月10日火曜日

多面体描画道楽

星形正多面体の次の対象は, 「大十二面体」である. 前回は「星形大十二面体」であった. 「大十二面体」と「星形大十二面体」があって, 相並んでいるのは, ノーメンクレイチャとしてはいかがかと思うが, 一松先生の本がそうなので仕方がない. 「星形大十二面体」と「なんとか大十二面体」といいたいところだ. その(星形でない)大十二面体の, 「正多面体を解く」の記述はこうだ. 「正二十面体の頂点に隣る5個の頂点のなす正五角形をそのまま面に採る.」 この上なく簡潔至極の表現だ. 上が正二十面体である. その頂点0に隣る5個の頂点のなす正五角形は, 下の図にオレンジ色で示す面1,2,3,4,5になる. これを「0に隣る面」ということにしよう. (その辺には小さく0と付記した.) さらに頂点23に隣る頂点の面を作ると のように2に隣る面0,1,10,11,3と, 3に隣る面0,2,11,7,4が得られる, ところで0に隣る面と2に隣る面は13で交わるからその交線は1から3へ引いた線である. 同様に0に隣る面と3に隣る面は24で交わるからその交線は2から4へ引いた線である. さらに2に隣る面と3に隣る面の交線は0から11へ至る. 従ってもとの正二十面体の面の1つの三角形0,2,3の中に3つの交線が現れる. その交点を下の図のようにPとする. 同様に三角形0,3,4の中に3つの交線が現れる. その交点を下の図のようにQとする. この2点の座標が決まると, 大十二面体を描くことが出来る. それがこれだ. この正多面体はPQの所が凹んでいて, 水が溜まる形である. 右下の頂点3を中心とした昔の陸軍の徽章のような星形がみられる. 3の星の1つの枝は0の星の枝でもあるから, この枝は2等辺三角形である. ところでPQの座標の計算法だが, 正二十面体をx軸方向から見た図を描くと になる. この図で1, 10短い方の辺の長さを2とすると, 図の 0, 6の長さは1+√5. Oから0までは(1+√5)/2. 0, 3も1なので, これらからP, Qのz座標(3+√5)/2, (√5-1)/2が得られる. これらを解くには (a+b√5)×(c+d√5)のような計算が頻発するから, この積がe+f√5であるとして, a,b,c,dからeとfを求めるプログラム
(define (mult a b c d)
 (list (+ (* a c) (* 5 b d)) (+ (* a d) (* b c))))
を用意すると仕事がはかどった.

2012年7月8日日曜日

多面体描画道楽

一松先生の「正多面体を解く」の星形正多面体に最初に登場するのは, 星形大十二面体である. その記述はこうだ. 「正十二面体の各面の頂点に隣る5個の頂点は同一平面上にあって, 大きな正五角形をなします. これを星形正五角形の形に結びますと, 全体として星形正五角形すなわち正5/2角形が, 各頂点に3個ずつ会する星形正多面体ができます.」

「隣り」を動詞に使うのは数学者だけだが, 意味は十分通じる. そこで描いてみると



正5/2角形を1個描いただけだとこうだが, 12個全部を描くと何も分からない.



この図をプリンタで出力し, 鉛筆であちこちなぞっていると, どうも正五角形の中央を凹ませ, 正十二面体の各頂点を頂点とする三角錐があるように思えてきた.

その凹みの座標を調べるため, 前回のようにzx断面を考えると,  0, 1, 2, 3, 4の面の凹みは3から8の線と4から10の線の交点にあるようだ.



この図で凹みの中心はP, そのz座標は(√5-1)/2である.

ここまで分かると, 後は隠面消去のために面の前後関係の調整だけで, 下のような図が出来た.



この星形正多面体の枠と芯は次のようだ. 外側のオレンジ色の正十二面体が枠で, 内側の紫の正二十面体が芯である. その芯の20個の各面の上に正三角錐が乗っている.

2012年7月7日土曜日

多面体描画道楽

オフィスの近くの神保町. ある日の昼に, 理系の本の多い明倫館書店の前を通り,  そういえば先日購入したのは何だっけ?

その1ヶ月ほど前に, 一松信先生の「正多面体を解く」を買ったのだが紙袋にいれたままオフィスに忘れていた.

この書の最後の方に星形正多面体の話題があった. そういえば以前正多面体や準正多面体をいろいろ描いたが, 星形は手つかずであったので早速その部分を読む.  申し訳ないが一松先生の本の図はどうもいまいち分かりにくいのである. やはりこの際, 自分で描いてみるか.



一松先生の受け売りだが, 2次元の星形正多角形(上の図の左下)の書き方には2通りある.  右上のように「芯」の正多角形の各辺を延長すると左下が出来る. あるいは右下の「枠」となる正多角形の頂点をいくつか置きに結ぶ.

星形正多角形は, 普通の正多角形とは違って見えるが, すべての辺の長さが等しく, すべての頂点の角度も等しいから, やはり正多角形である. この図の星形正多角形は正5/2角形というらしい.

立体の手始めは星形小十二面体である. これは正十二面体を芯とし, その各面を延長する.

2010年6月1日の私のブログの



正十二面体を芯とし, そのプログラムの修正て始めよう.

この正十二面体の正面左上を向いている面(頂点が0, 1, 2, 3, 4の面)に隣接する5枚の面を延長すると点20で合わさった五角錐になり



が出来る. この操作を他の11枚の面についても行うと



が描ける.

五角錐の頂点の座標は下の図のように得られる.



最初の正十二面体で立体を貫くの赤, 緑, 青はx軸, y軸, z軸である. 上の図は立体のzx面の断面である. Aは01の, Bは313の, Cは817の中点で, Oは立体の中心だ.

20は辺3, 13の延長線上にあり,  立体の辺(稜)の長さの半分を1とすると, OA=OB=OC=(3+√5)/2からx座標が2+√5である.

さて, 星形小十二面体を眺めると, 面0, 1, 2, 3, 4を延長した面28, 21, 29, 26, 24は正5/2角形である. こういう形が12枚あるわけだ. 芯の正十二面体の12の面に五角錐を載せたから, 頂点も12ある. 辺は各頂点から5本出ているが, 相棒の頂点と共有だから都合30本になる.

例のEulerの公式は 面+頂点=辺+2だが, 12+12≠30+2で公式が成り立たないという. 「正多面体を解く」にはちゃんと説明があるが, 受け売りになるので省略.

さてもう1回似たような図を示す.



このオレンジ色の破線は星形正多面体の枠の正二十面体である. 平面だと, 頂点をいくつか置きに辿るといえるが, 立体の場合はどういえばいいだろうか.

一方, 星形小十二面体の隠面消去だが, 五角錐を構成する三角形を遠方にある物から並べ, 各三角形を描画する際, まず内側を白で塗りつぶしてから黒で輪郭を描いた.

始めの正十二面体では, 各面の法線方向を計算し, それと視線の角度を計算して面の見える/見えぬを決めている.