地図/創発/グリッド

環をなす状態 — 巡回CA

各セルが 0〜k-1 の整数の状態を持ち、その状態を環(リング)につなぐ。状態は (state + 1) % k で1つずつ進み、k に達したら 0 に戻って一周する。

近傍の数え方が条件付きになる。8近傍の総数でなく、「自分のひとつ先の状態を持つ隣」だけを数える。その数が閾値に届けば、自分もその先へ進む。8近傍を回しながら、want と一致した隣だけ勘定する。

const want = (s + 1) % states // 自分の次の状態
let count = 0
for (let dy = -1; dy <= 1; dy++) {
  for (let dx = -1; dx <= 1; dx++) {
    if (dx === 0 && dy === 0) continue
    if (at(x + dx, y + dy) === want) count++ // 先を行く隣だけ数える
  }
}
next[i] = count >= threshold ? want : s // 足りれば進む、足りなければ留まる

ランダムなノイズから始めると、最初はちらちらと点滅するだけになる。欠けのある波が芽を出し、その欠けが芯になって螺旋波が巻き始める。

巡回CA(cyclic cellular automaton)。David Griffeath が広めた、状態を環につないだCA。各セルは自分のひとつ先の状態を持つ隣が閾値以上あるとき、その先へ進む。状態 k は k+1 に追われ、k+1 は k+2 に追われる——この一方向の追従が、止まれない波(進行波)を生む。同じ枠組みは Greenberg-Hastings モデルとも書かれ、静止・興奮・不応の状態を環で巡る興奮性媒質(excitable media)の最小モデルになる。心臓の電気的興奮の伝播や、Belousov-Zhabotinsky 反応で見られる螺旋波が、この環状の状態遷移で説明される。

状態を明度に写しているので、環を一周する濃淡の縞がそのまま波面になる。states を増やすと波の波長が伸び、threshold を上げると波が立ちにくくなって固まる。数えるのを総数でなく「先を行く隣」に絞り、状態を環で進めるだけで、止まらない波が回り続ける。