Недавно мне понравились наброски Зака Либермана, и я начал думать об аналогичных клеточных анимациях, где клетки динамически взаимодействуют с другими соседними клетками. Я пробовал различные конкурентные и совместные динамики для этих взаимодействий. Результаты, оглядываясь назад, напоминают эволюционные симуляции хищника/жертвы (вроде этих) — я нахожу визуализацию растущего городского пейзажа довольно убедительной (хотя и далеко не такой эстетически интересной, как наброски Зака).

Правила/ограничения для всех экспериментов:

  • Все ячейки инициализируются с небольшими случайными высотами и небольшими случайными скоростями роста (положительными и отрицательными).
  • Симуляция завершается, если все ячейки не имеют высоты или какая-либо ячейка достигает 100 (а иногда и никогда)
  • Динамика каждой ячейки полностью описывается одной функцией, которая передает состояние ячейки и всех ее соседей и возвращает одно изменение скорости ее роста (может быть вверх, вниз или ноль).
  • Клетки окрашены в красноватый цвет, когда скорость роста снижается (становится более отрицательной), и в зеленый, когда положительная. Серый иначе.
  • Размеры окрестностей могут варьироваться (здесь они находятся в диапазоне от 1 до 5)

Каждый помечен описанием используемого правила и интерпретацией результата. Из-за случайной инициализации некоторые из них выглядят совершенно по-разному при каждом запуске.

Тривиальные испытания

Чуть интереснее

Выводы:

  • В некоторых случаях оказалось на удивление трудно превратить концепцию (мое предположение о том, как будет работать динамика) в ожидаемый результат. Плохая интуиция для динамических систем?
  • Многие сложные правила быстро рушатся, приводя к тривиальным результатам — достижение баланса (для создания стабильности) иногда бывает сложной задачей.
  • Мерцание — результат того, что логика застревает на линии между двумя состояниями — поможет буфер или какая-то реализация импульса.

Код (все это делается с помощью paper.js) находится здесь.