С Новым годом, друзья и коллеги!
На новогодние праздники обычно украшают ёлки, делают новогодние игрушки, вырезают снежинки из салфеток. А я решил сделать генератор снежинок. Нет снега настоящего, будет хоть искусственный.

На мысль меня натолкнули клеточные автоматы — более общий случай игры «Жизнь». Те самые, у которых на каждом новом шаге рассчитывается новые значения клеток поля.
В некоторых случаях, поведение клеточного автомата напоминает рост кристалла. Начальное положение — маленькая «затравка». Новое состояние клетки рассчитывается на основании состояний самой клетки и ее четырех соседей: сверху, снизу, слева и справа — симметричной окрестности. В результате получаем настоящий кристалл — фигуру с явно выраженной симметрией.



Снежинки тоже симметричные, но они шестиугольные, значит надо сделать такой клеточный автомат, который бы обладал гексагональной симметрией. Для этого будем строить клеточный автомат не на клетках, а на сотах.

Для задания сот будем использовать старый добрый двумерный массив, содержащий нули (пустая ячейка) и единицы (заполненная ячейка). В качестве окрестности точки выберем маленькую снежинку, которая для ячейки (x,y) будет задаваться двумя способами. Для четных y:
, и для нечетных:
Очень похоже, но различия есть.
В качестве правила возьмем правило четности-нечетночти: если вокруг ячейки (в пределах окружающей снежинки) окажется нечетное число соседей, то ячейка устанавливается в единицу — окрашивается, если четное — сбрасывается в ноль.
Затравкой будет маленькая снежинка в центре поля.
Последний штрих — это добавление элемента случайности, ведь одинаковых снежинок не бывает. На каждом шаге будем генерировать случайное число от 1 до 9. Если число соседей ячейки больше этого случайного числа, то будем состояние принудительно сбрасывать в ноль. Тем самым мы будем разреживать нашу снежинку.
Отрисовывать будем каждое второе состояние нашего поля, так, мне кажется красивее.
Вырезать снежинки — увлекательное занятие. Вы можете придумать свои правила — вот jsFiddle. Можно даже посоревноваться, кто придумает самые лучшие правила для моделирования роста кристаллов льда в обычной снежинке.
На новогодние праздники обычно украшают ёлки, делают новогодние игрушки, вырезают снежинки из салфеток. А я решил сделать генератор снежинок. Нет снега настоящего, будет хоть искусственный.

На мысль меня натолкнули клеточные автоматы — более общий случай игры «Жизнь». Те самые, у которых на каждом новом шаге рассчитывается новые значения клеток поля.
В некоторых случаях, поведение клеточного автомата напоминает рост кристалла. Начальное положение — маленькая «затравка». Новое состояние клетки рассчитывается на основании состояний самой клетки и ее четырех соседей: сверху, снизу, слева и справа — симметричной окрестности. В результате получаем настоящий кристалл — фигуру с явно выраженной симметрией.



Снежинки тоже симметричные, но они шестиугольные, значит надо сделать такой клеточный автомат, который бы обладал гексагональной симметрией. Для этого будем строить клеточный автомат не на клетках, а на сотах.

Для задания сот будем использовать старый добрый двумерный массив, содержащий нули (пустая ячейка) и единицы (заполненная ячейка). В качестве окрестности точки выберем маленькую снежинку, которая для ячейки (x,y) будет задаваться двумя способами. Для четных y:
(x, y), (x-1, y), (x-2, y), (x+1 ,y), (x+2, y), (x-1, y-1), (x, y-1),
(x-1, y-2), (x+1, y-2), (x-1, y+1), (x, y+1), (x-1, y+2), (x+1, y+2)
, и для нечетных:
(x, y), (x-1, y), (x-2, y), (x+1 ,y), (x+2, y), (x, y-1), (x+1, y-1),
(x-1, y-2), (x+1, y-2), (x, y+1), (x+1, y+1), (x-1, y+2), (x+1, y+2)
Очень похоже, но различия есть.
В качестве правила возьмем правило четности-нечетночти: если вокруг ячейки (в пределах окружающей снежинки) окажется нечетное число соседей, то ячейка устанавливается в единицу — окрашивается, если четное — сбрасывается в ноль.
Затравкой будет маленькая снежинка в центре поля.
Последний штрих — это добавление элемента случайности, ведь одинаковых снежинок не бывает. На каждом шаге будем генерировать случайное число от 1 до 9. Если число соседей ячейки больше этого случайного числа, то будем состояние принудительно сбрасывать в ноль. Тем самым мы будем разреживать нашу снежинку.
Отрисовывать будем каждое второе состояние нашего поля, так, мне кажется красивее.
Вырезать снежинки — увлекательное занятие. Вы можете придумать свои правила — вот jsFiddle. Можно даже посоревноваться, кто придумает самые лучшие правила для моделирования роста кристаллов льда в обычной снежинке.