ライフゲームを拡張して反応拡散もどきを作った
=前置き=
ベタな反応拡散系はパラメータのいじり方がよくわからずに調整できなかったので、生死条件のわかりやすいライフゲームを拡張することで反応拡散系っぽいものを作ることにした。
=wonderfl=
wonderfl build flash online | 面白法人カヤック
今回は少しだけインタラクションと乱数を組み込んでみた。
マウスでドローすることでその部分を消すことができ、Shiftを押しながらだとさらに広範囲になる。
また、リロード(右下のボタン)を押すたびに少し違うパターンで変化する。
=考え方=
基本的なライフゲームの考え方は
- まわりに誰も居なければ死亡
- まわりに数人居れば生存
- まわりを全て囲まれたら死亡
というもので、さらに拡散処理も兼ねている。
これを拡張して
- まわりに誰も居なくても生存
- 狭い範囲で囲まれても生存
- 広い範囲で囲まれたら死亡
とすることで、今回のような「幅を持ち」「前回のものは残りつつ」「線で拡散する」という処理を実現している。
ただ、これだけだと拡散力が弱いので、さらにブラー(ぼかし、引き伸ばし)をかけることで拡散を促している。
=参考サイト=
- 反応拡散系についての解説
- 実際のコーディング例
=現時点での反応拡散系の理解=
現状での理解のメモとして。
当初は「"活性"の方が"抑制"より先に移動することで拡大していくんじゃないの?」と思ってたけど、説明してあるところでは"抑制"の方が先に拡散するようになっていて、上の反応拡散もどきでも"抑制"の方が先に拡散するのと同じものになっている。
今でもちゃんと理解しているかは怪しいけど、現状の認識では「"抑制"の方が拡散が早い」=「"抑制"の濃度が"活性"よりも先に下がる」=「"活性"を抑え込めない」から"活性"が拡散するんだ、と思っている。
そして、「"活性"が多いところでは"抑制"も多くなる」+「"抑制"の方が拡散が早い」=「"活性"の周辺には大量の"抑制"ができる」=「"活性"より先に"抑制"にぶつかるので、"活性"同士がつながらずに止まったり屈折する」という状況になるなのだと思う。
=予定=
元々はこれを使って「蝶の羽」を作る予定だったものの、思いのほか反応拡散系の学習で負荷がかかってしまい、やる気が持続できなくなったので中断。あとは「ベジエで羽を作る」&「板ポリを2枚用意して蝶を作る」だけで完成なんだけど。
元々は
- 「モデルを作らなくても板ポリだけで作れるものを色々と試したい」
- 「蝶だったら板ポリ2枚で作れる」
- 「それだけじゃ寂しいのでせめて模様くらいは自動生成しよう」
- 「前例があるか調べてたら反応拡散系を見つける」
- 「BitmapDataとFilterで高速化したコードにできそうだから試してみよう」
という軽い気持ちで始めたものの、
- 「誤差やら何やらの問題で意外と手間」
- 「コードの移植だけじゃなくちゃんと原理を理解しようとしたので負荷がかかる」
- 「移植はそれっぽくできたものの、調整コストがだいぶ高い」
- 「ライフゲームを拡張して作れそうだし、そっちの方が調整は楽そう」
という感じで色々な負荷がかかってしまった。調子が良ければ大丈夫な範囲の行動パターンだけど、今やるのはまだつらい。
ということで、もっと簡単なものを作る。2.5D表現まわりは試したいけど、あまりこだわらずに簡単にできるかどうかだけ考えて作る。
=追記=
以前作った「マウスで描いた方向に玉が流れる」というやつを少しいじってみた。
今週はこのレベルのものを作っていく予定。