セルオートマトンで動物の体表模様を作る
セルオートマトンで動物の体表模様を作る
セルオートマトン(cellular automaton)とは、格子状のマス目を使って計算を行う手法のことです。
automaton(自動人形)という単語が表すように、周囲のマス目から影響を受けながら、自律的に該当するマス目の値を決めていきます。
有名なライフゲームもセルオートマトンの一つです。
今回は、A New Kind of Scienceという本を参考に、セルオートマトンで動物の模様を描いてみましょう。
なお、当ページで使用した動物の画像は、フリー画像素材を扱うサイトのpixabay様よりダウンロードしたものです。
さて、いつもはパターンを描く際にプログラミング言語のpythonを利用するのですが、今回はマス目を使うので、Excelを使って描いてみましょう。
Excelは、VBAという言語を使ってマス目の操作などを行うことができます。
まずはExcelで100×100のマス目を作ります。
そしてマス目に対して行う操作をプログラムにしていきます。
今回のルールを説明します。
まず、各マス目をランダムで黒か白に塗ります。
このとき黒か白かは等確率で選んでいます。
そうしたら、以下のルールに従って各マスの色を変化させていきます。
左上の画像の、真ん中のセルを対象として考えます。
対象のセル自身と、対象のセルから1だけ離れたセルの中で、黒く塗られているセルに1という番号を振ります(右の画像で緑に塗られているゾーンは1のゾーン)。
このとき斜め右上なども距離が1と数えます。
対象のセルから2または3離れているセルの中で、黒く塗られているセルに-0.4という番号を振ります(右の画像で黄色に塗られているゾーンは-0.4のゾーン)。
図の中に書かれている1や-0.4を全て足し合わせます。
図では1が3つ、-0.4が7つあるので、1*3+(-0.4)*7=0.2となります。
この足し合わせた数字が0を超えたら対象のマスを黒く塗り、0以下であれば白く塗ります。
今回は0.2なので、真ん中のマスは黒のままにします。
これを全てのマスに対して繰り返します。
この操作を全部で4回繰り返してみます。
すると、下の模様ができました。
今度は、パラメータ-0.4を他の値に変えて描いてみましょう。
-0.3の場合
-0.2の場合
これらは動物の体表の模様と類似点が見られます。
参考までに、いくつか動物の画像を載せてみました。
全く一致とまではいきませんが、動物の斑点や縞の模様に似ています。
実際にこのようなルールで動物の体表の模様ができているのかは分かりません。
ですが、何か模様を作る方法として、周りの模様を判断基準として模様を作っていくというのは、簡単ですしありえそうな気がします。
この模様を作る方法では、-0.4の値を変えると模様が変わりました。
計算に使うマスを変えたりすることで、さらに違ったタイプの模様を描くこともできます。
別のページでは、サバの背中の模様を再現しました。
なお、最後にこの模様を描くために作成したVBAプログラムを載せておきます。
Sub rule()
t = Cells(102, 104)
c = Cells(102, 107)
For m = 2 To 101
For n = 2 To 101
If Rnd > 0.5 Then
Cells(m, n).Interior.ColorIndex = 1
Else
Cells(m, n).Interior.ColorIndex = 2
End If
Next n
Next m
For k = 1 To c
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(251, 151), Cells(350, 250))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(151, 251), Cells(250, 350))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(251, 251), Cells(350, 350))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(251, 351), Cells(350, 450))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(351, 251), Cells(450, 350))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(151, 151), Cells(250, 250))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(351, 151), Cells(450, 250))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(151, 351), Cells(250, 450))
Range(Cells(2, 2), Cells(101, 101)).Copy Range(Cells(351, 351), Cells(450, 450))
For m = 151 To 450
For n = 151 To 450
If Cells(m, n).Interior.ColorIndex = 1 Then
Cells(m, n) = 1
End If
Next n
Next m
For m = 251 To 350
For n = 251 To 350
thresh = 0
'周辺のセルの判定
For p = -3 To 3
For q = -3 To 3
If Cells(m + p, n + q) = 1 And (p ^ 2 + q ^ 2) ^ (1 / 2) < 1.5 Then
thresh = thresh + 1
ElseIf Cells(m + p, n + q) = 1 And (p ^ 2 + q ^ 2) ^ (1 / 2) > 1.5 Then
thresh = thresh + t
End If
Next q
Next p
If thresh > 0 Then
Cells(m – 249, n – 249).Interior.ColorIndex = 1
Else
Cells(m – 249, n – 249).Interior.ColorIndex = 2
End If
Next n
Next m
Next k
End Sub