(ランダムに生成される シェルピンスキー ギャスケット) 2009.10.25
       Sierpinski-Gasket

   カオスゲーム  Chaos game

 

 カオスゲーム(Chaos game)と呼ばれる,ランダムに生成されるシェルピンスキーギャスケット

シェルピンスキーのギャスケットの話題は,過去も数度,フラクタル関係で作成してきている。ここここなどを参照してもらいたい。

今回は,その応用編にもなるのか,カオスゲームと呼ばれる方法でのギャスケットの作成である。つまり,ランダム関数を利用して,規則的に作るわけではなく,不規則に生成されるという不思議な状況を見ていただきたいと考えている。「不規則」に生成されるならば,「不定形」を描きそうなもんだが,美しいギャスケットに収束していくのである。

生成方法は,下記のとおりである。


右のような動きで,このような紫色の点が増えていく。


緑色の線分の中点に新しい紫色点を置く。

 もう少し,右上の生成方法を追いかけてみる。このアルゴリズムは,

 1.最初は,正三角形の赤の3点があるのみである。

 2.任意の場所に点を打つ(最初はどこでも構わない,右上青の点である。)

 3.その青の点と,最初の赤の点(どれでも構わない)の中点に点を置く。(紫の点)

 4.紫の点と,最初の赤の点(やはりどれでも構わない)とに3.方法で新たな中点(紫色)をとる。

 5.4.を延々と繰り返す。

の1〜5を基本としている。

 

 以上であるわけだが,必要なのは,最初の正三角形の三点だけである。その後は,青の初期条件の点はどこでもよく,中点を取るためのターゲットとなる赤の点は,3つのうちどれでも構わない。この,最初がどこでもよく,中点を取るための目標点もどこでも良い,というところに,ランダムさが現れるわけである。

 普通の感覚で言うと,これだけ適当な事をしているのであれば,雑多なごちゃごちゃな図形が描かれそうな雰囲気であるが,そうではなく,シェルピンスキーギャスケットに収束していくところが面白い。これがカオスゲームと呼ばれるものである。(ま,一般的に仕事を雑に,適当に,行き当たりばったり的にこなしていって,いい仕事などできるはずなど無いと私は考える。ルールらしきものは,真ん中,それだけである。しかし,その結果,最終的に美しい図形になるなんて許せないところだが,「真ん中」というルールを絶対に外れずに繰り返す事が,結果的にに良いものを作り出してしまうことに,驚きを感じるのだ。)

 ちなみに,普通のシェルピンスキーのギャスケットの描き方は,主に次の2つの規則的な方法による事が多い。

 1.面的な方法

  正三角形に50%縮小し,180°回転した正三角形を載せて,正三角形を4つのパーツに分けていく方法。

 2.線的な方法

  上記とほぼ同じであるが,正三角形の辺の中点同士を結び,新たな小正三角形にも同様に繰り返す方法。

 今回のカオスゲームでは,どの点との中点でも構わない,またそれによって,プロットされる点の集まりが全体を無作為に描画していく。これは,上記1.2.のような順番に点を描画していく普通のフラクタルとは対照的であり,このアルゴリズムによって無数の点が描画されることで,いかにも画像が ”浮かび上がってくる” ところが興味深い点である。

下記のリンクは参考となるところである。

http://www.cut-the-knot.org/Curriculum/Geometry/SierpinskiChaosGame.shtml

【作成したN88BASICのプログラムファイル】

10 REM -----Gasket-----
20 CLS 3 : SCREEN 3,0
30 DIM XX(16380),YY(16380)
40 x1=0 : y1=0 : x2=100 : y2=173.2 : x3=200 : y3=0
50 S=1 : U=0 : Y=0 : CLS
60 input "x4=";x4
70 input "y4=";y4
80 PSET(X1+100,Y1+300) : PSET(X2+100,-Y2+300): PSET(X3+100,Y3+300)
90 pset(X4+100,-Y4+300)
99 for h=1 to 1000 : next h 
100 randomize
110 k=int(rnd(1)*3)+1
120 if k=1 then goto 130 else goto 160
130 XX(S)=(X1+x4)/2 : YY(S)=(Y1+y4)/2
140 pset(XX(s)+100,-YY(s)+300)
150 goto 220
160 if k=2 then goto 170 else goto 200
170 XX(S)=(X2+x4)/2 : YY(S)=(Y2+y4)/2
180 pset(XX(s)+100,-YY(s)+300)
190 goto 220
200 XX(S)=(X3+x4)/2 : YY(S)=(Y3+y4)/2
210 pset(XX(s)+100,-YY(s)+300)
220 randomize
230 m=int(rnd(1)*3)+1
233 for h=1 to 60 : next h 
240 if m=1 then goto 250 else goto 280
250 S=S+1 : XX(S+1)=(XX(S)+x1)/2 : YY(S+1)=(YY(S)+y1)/2
260 pset(XX(s+1)+100,-YY(s+1)+300)
270 goto 340
280 if m=2 then goto 290 else goto 320
290 S=S+1 : XX(S+1)=(XX(S)+x2)/2 : YY(S+1)=(YY(S)+y2)/2
300 pset(XX(s+1)+100,-YY(s+1)+300)
310 goto 340
320 S=S+1 : XX(S+1)=(XX(S)+x3)/2 : YY(S+1)=(YY(S)+y3)/2
330 pset(XX(s+1)+100,-YY(s+1)+300)
340 IF S>2000 THEN goto 360
350 GOTO 230
360 end

110行でランダムに1,2,3を生成し,3点のどれかとの中点を作っているのだが,いやぁ〜こりゃ適当に作ったのが,バレバレの下手糞なもんだ,あー恥ずかしい。。。

今回利用したソフトは,

N88BASICで作成後実行した画面を,ディスプレイキャプチャーあれで,AVIファイルに取り込み,GIFアニメをフリーソフト,Giam ver.2.03で変換した。更に基本図形作成にPhotoshopである。

 もどる