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

これはKritaという無料のペイントツールですが、Conwayのライフゲームが動作しています。
スクリプト等は用いておらず、標準のフィルターと合成レイヤーのみを用いています。
解説
端的に言うと次の4レイヤーを重ねることでライフゲームの次の世代の計算を行うことができます。
- ぼかしフィルター
-
#b88b73加算 - カラー補正フィルター
-
#000000彩度HSV
ぼかしフィルター
ここが一番の肝です。
今回使うぼかしフィルターの設定は以下のとおりです。
- 水平方向の半径
1 - 垂直方向の半径
1 - 強さ
1 - 角度
0° - 形状
矩形
この設定のぼかしフィルターは、"理想的には"周囲3×3ピクセルの情報をもとに
というカーネルを用いて計算されるはず…なのですが、実際は8bitに量子化されて計算されており、
というように、中央要素の寄与が本来よりもわずかに小さく評価されます。
このわずかなずれがあることにより、生セルを255、死セルを0とし、その周囲に生セルが
| 始状態 \ 周囲の生セル数 | 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に揃えることができます。(揃える値は1〜254であれば任意です)

R・G・Bそれぞれの254にのみ反応するカラー補正
| 加算前 | 加算後 |
|---|---|
![]() |
![]() |
判定すべき値が揃っていれば、RGBAを同時に判定することができ、フィルターが1回で済みます。
| フィルター適用前 | フィルター適用後 |
|---|---|
![]() |
![]() |
ここまで来ればもうほとんどできたようなものです。
彩度HSVによる仕上げ
仕上げに彩度を落とせば、世代の計算は完了です。
具体的には、#000000などの彩度を持たない色で満たした彩度HSVを重ねることで実現できます。
| 彩度調整前 | 彩度調整後 |
|---|---|
![]() |
![]() |
これらを重ねる
上記の仕組みはすべてレイヤーになっているので、コピーして重ねれば次の世代が計算できます。
あとはPCスペックの許す限り重ねれば良いわけです。
| 世代 | 実行画面 |
|---|---|
| 1世代目 | ![]() |
| 2世代目 | ![]() |
| 3世代目 | ![]() |








Discussion