This reminds me of Belousov–Zhabotinsky reactions, which can be modeled by cellular automata, or realized by chemical reactions, slime molds, and coral reefs. (Of course, after staring at them for as many hours as I have, everything reminds me of Belousov–Zhabotinsky reactions! ;)

https://en.wikipedia.org/wiki/Belousov%E2%80%93Zhabotinsky_r...

The essence of a cellular automata rule that exhibits BZ reactions is:

There are two forces at work playing off against each other: stimulation and inhibition. Stimulation is implemented by observing your local surrounding neighbors. Inhibition is implemented by a delay. The result is beautiful spiraling oscillations!

A cell can be stimulated or quiescent (one bit). And it has a timer to remember how long ago it was stimulated (typically another bit). When it's quiescent, and the stimulation condition is true, it becomes stimulated, and sets the timer. In subsequent steps, it finishes being stimulated, then the timer expires, and it can't be stimulated again until the timer expires.

The stimulation condition is usually a counting rule, like Life: it sums the number of stimulated neighbors, and then uses that to index into a look-up table to decide its next state.

The effect is that waves of stimulation spread out throughout the medium, and the wave's leading edge propagates into areas that are not stimulated, until it hits another wave, and they cancel each other out or reflect waves in other directions.

The trailing edge of the wave is caused by the inhibition, and consists of cells that have just been stimulated and won't be stimulated again immediately -- that way the wave spreads in one direction instead of all directions at once.

By changing the stimulation condition, you can generate different shapes of waves, which usually develop into interlocking spirals forming around stable nucleation patterns.

One metaphor for how this rule works is to the worm-like animals in a coral reef, who come out of their shells to feed, then pull back inside their shells when tickled by adjacent worms pulling back, only to come back out after a short time. That's why this particular CA rule is called "WORMS" (in Toffoli and Margolus's "Cellular Automata Machines" book).

Here's some JavaScript code that implements three kind of worms, with three different kinds of stimulus conditions (alarms), which I call "Yuppy Worms", "Hipster Worms" and "Bohemian Worms":

https://github.com/SimHacker/CAM6/blob/master/javascript/CAM...

The "Yuppy Worms" are all uptight, geometrical and diagonal. The "Hipster Worms" are more relaxed and rounded. And the "Bohemian Worms" are all rough and fuzzy and organic.

// The personality is a key into the dict of alarm arrays,
// which are indexed by the count of excited neighbors,
// and contain 1 if the cell should be excited or 0 if
// not.
var alarms = {

// This results in spirals with tight straight diagonal diamonds.
yuppie: [0, 0, 1, 1, 1, 1, 1, 1, 1],

// This results in spirals with loose smooth rounded diamonds.
hipster: [0, 0, 0, 1, 1, 1, 1, 1, 1],

// This results in spirals with looser rustic fuzzy spirals.
// That is due to the anneal-like discontinuity in the alarm table.
bohemian: [0, 0, 1, 0, 1, 1, 1, 1, 1]

}[personality];

The Yuppie and Hipster look-up tables vote with the majority (for different definitions of majority), while the "anneal-like discontinuity" in the Bohemian alarm table is kind of like a non-conformist tie-breaker voting the other way when the vote is almost even (which is the essence of the "anneal" CA rule). That causes turbulence and roughness, so it looks much more organic than geometric.