セルオートマトン
これは複素数平面ではありませんが,「フラクタルCGコレクション(渕上季代絵著:サイエンス社)」 (以下,「この本)にあるので扱ってみました。
「再帰図形」「反復関数系」で扱ってきたのは,いわゆる「自己縮小写像」によって得られたものです。これに対し,セルオートマトンでは自己増殖しながらフラクタル図形を生成していきます。
次のような「セル」の並びを考えます。縦横の数は同じでなくても構いません。
1行目(t=1) のセルから,2行目(t=2)のセルを決定します。たとえば,左の図のように,黄色のセルの値を加えて赤のセルの値になるとします。ライフゲームに似ています。
1行目が初期状態です。時間とともに下に向かって増殖していきますので,y ではなく,t を用いています。
初期状態では,1つのセルだけが値1であるとしましょう。すると,右図のように,第2世代が決まります。
同じルールで第3、第4と世代が変わっていきます。
図でわかるように,値はだんだん大きくなりますが,これを,2値(0と1)だけに制限すると次のようになります。2値化は,得られた値を2で割った余りとします。(下図左)
コンピュータの画面の1ピクセルを0と1に対応させると右のような図形ができます。
2値でなく,8値にすると次のようになります。得られた値を8で割った余りです。
この本には,次のプログラムが掲載されています。
言語はN88BASICですが,当時のパソコンのスペックを知らないと,これだけでは意味がわからないかもしれません。
当時のパソコン(NEC ではPC9801シリーズ があり,EPSONでその互換機 PC286,386 を出していた頃)では,扱えるカラーは16色でした。基本はRGBの8色で,R,G,Bの3つのプレーンを用意して混色します。これにもうひとつプレーンを用意し,4096色の中から16色を選んで「パレット」を作っていました。「プレーン」というのは,画面解像度 640×400 の点を表すメモリ空間です。基本が8色なので,このプログラムも8色で考えています。100行目の「MOD 2」を「MOD 8」にすれば,8つの値で色を決められたわけです。
40行目の「NX=639 」が画面上の横のピクセル数に該当しています。
画面上の1ピクセルの色を決めるのが,110 行目の PSET です。
現在のパソコンでは,解像度はいくつか決められます。ディスプレイによっても変わります。したがって,設定したエリアに対して点を打つのですが,点の大きさが小さいとスカスカになったり,大きいと重なってしまったりしますので調整が必要です。次に示すのは CindyScript によるプログラムです。
Col=[[0,0,0],[1,1,1],[1,0,0],[0,1,0],[0,0,1],[1,1,0],[1,0,1],[0,1,1]];
Hn=200;
Vn=150;
Pt=apply(1..Vn,apply(1..Hn,0));
Pt_1_99=1;
repeat(Vn-2,t,start->2,
repeat(Hn-2,x,start->2,
s=Pt_(t-1)(x-1)+Pt(t-1)(x+1);
Pt_t_x=mod(s,2);
);
);
Pt=reverse(Pt);
repeat(Vn,y,
repeat(Hn,x,
draw([x,y]/10,border->false,color->Col(Pt_y_x+1));
);
);
9行目の「Pt_t_x=mod(s,2);」が2値化です。これを「Pt_t_x=mod(s,8);」に変えればカラー8色になります。
また,したから3行目の「draw([x,y]/10」で点の大きさを調整しています。
以上を基本として,バリエーションを考えます。
(1) 生成の規則を変える
(2) 初期値の1の場所を変える
(3) 初期値の1の場所をランダムにする
(4) 生成後にその値をあるコードで変換する。
次のWebページに(1)と(2)をインタラクティブに変更できるものを作りました。
リンク先を開くとつぎの画面になります。
緑色のボタンが表示されない場合は再読み込みしてください。
「色数」は2から8まで。
「初期値の場所の数」は7まで。1なら中央,2以降は等分した位置になります。
「初期値の場所をランダムにする」は,描画のたびに位置をランダムに変えます。
「描画のたびに」とは,画面上でマウスを動かしたりクリックしたりするたびに再描画されるからです。
「生成要素」は現在の i 番目に対し,上の段(前の世代)のどのセルの和をとるか,です。「この本」には,「i-1 と i+1 」 の次に「i-1, i 」が載っています。
この本には「i-3」まで使ったものもありますが,だからどう,ということもないので,±2までにしています。
また,1行目のセルの値をまったくランダムに決めるのもありますが,結果は次のようになり,これもどうということはあまりありません。
7ヶ所までにして「初期値の場所をランダムにする」としても次のようになります。
また,1行目のすべてのセルの 0 / 1 をランダムに決めた後,「(4) 生成後にその値をあるコードで変換する。」が載っていますが,これは「あるコード」をインタラクティブに決めるには少し無理があるので(CindyJSはいまのところキーボード入力に対応していません),その機能はつけていません。興味がある人は直接プログラムを書いてみてください。たとえば,「s=Pt_(t-1)(x-1)+Pt(t-1)(x+1)」で得られた値に対し,「0→6,1→1,2→0,3→3,4→6,5→2,6以上は0」といったように変換をします。