🎨

ペイントツール上でライフゲームを動かす

に公開

これはKritaという無料のペイントツールですが、Conwayのライフゲームが動作しています。

スクリプト等は用いておらず、標準のフィルターと合成レイヤーのみを用いています。

解説

端的に言うと次の4レイヤーを重ねることでライフゲームの次の世代の計算を行うことができます。

  • ぼかしフィルター
  • #b88b73 加算
  • カラー補正フィルター
  • #000000 彩度HSV

ぼかしフィルター

ここが一番の肝です。
今回使うぼかしフィルターの設定は以下のとおりです。

  • 水平方向の半径 1
  • 垂直方向の半径 1
  • 強さ 1
  • 角度
  • 形状 矩形

この設定のぼかしフィルターは、"理想的には"周囲3×3ピクセルの情報をもとに

\begin{pmatrix} 0.0909… & 0.0909… & 0.0909… \\ 0.0909… & 0.2727… & 0.0909… \\ 0.0909… & 0.0909… & 0.0909… \\ \end{pmatrix}

というカーネルを用いて計算されるはず…なのですが、実際は8bitに量子化されて計算されており、

\frac{1}{943} \begin{pmatrix} 86 & 86 & 86 \\ 86 & 255 & 86 \\ 86 & 86 & 86 \\ \end{pmatrix} = \begin{pmatrix} 0.09119… & 0.09119… & 0.09119… \\ 0.09119… & 0.27041… & 0.09119… \\ 0.09119… & 0.09119… & 0.09119… \\ \end{pmatrix}

というように、中央要素の寄与が本来よりもわずかに小さく評価されます。

このわずかなずれがあることにより、生セルを255、死セルを0とし、その周囲に生セルがn個ある場合、ぼかしフィルター適用後の値は

始状態 \ 周囲の生セル数 0 1 2 3 4 5 6 7 8
0 23 47 70 93 116 140 163 186
69 92 115 139 162 185 208 232 255

というように、全てのパターンで固有の値を持ちます。(うれしい!)

すなわち、Conwayのライフゲームのルールは
「ぼかしフィルター適用後に70 115 139のいずれかの値であれば次の世代も生かす」
と言い換えられることが出来ます。

フィルター適用前 フィルター適用後

加算とカラー補正フィルター

では具体的にどのようにすればこれを判断し、残すことができるでしょうか?
3パターンを検出する必要がありますが、(大変運のいいことに)色はR,G,Bの3チャンネルから構成されています。

これを踏まえると(R, G, B)=(255, 255, 255)を生セルとしてぼかしフィルターをかけ、

  • (70, 任意, 任意)
  • (任意, 115, 任意)
  • (任意, 任意, 139)

のいずれかの色になっているかを判定すれば良いことがわかります。

次のような鋭利なカラー補正フィルターを用いることで、例えばR=70のときだけ色を残すことができます。

これをR、G、Bそれぞれに対して行なっても良いのですが、フィルターが3回分必要になります。

(R, G, B)=(184, 139, 115)の色を加算することで判定すべき値を254に揃えることができます。(揃える値は1254であれば任意です)


R・G・Bそれぞれの254にのみ反応するカラー補正

加算前 加算後

判定すべき値が揃っていれば、RGBAを同時に判定することができ、フィルターが1回で済みます。

フィルター適用前 フィルター適用後

ここまで来ればもうほとんどできたようなものです。

彩度HSVによる仕上げ

仕上げに彩度を落とせば、世代の計算は完了です。
具体的には、#000000などの彩度を持たない色で満たした彩度HSVを重ねることで実現できます。

彩度調整前 彩度調整後

これらを重ねる

上記の仕組みはすべてレイヤーになっているので、コピーして重ねれば次の世代が計算できます。
あとはPCスペックの許す限り重ねれば良いわけです。

世代 実行画面
1世代目
2世代目
3世代目

Discussion