SamSuka
foo52ru ТехноШаман
foo52ru ТехноШаман

boosty


Описание алгоритма Digital Garden

Здесь я опишу суть алгоритма в упрощенном виде. 
Растение состоит из 10 уровней (0 ... 9)
Для каждого уровня есть свой набор генов, которые описывают его параметры. 
Пример генома для растения из 10 уровней и 24 признаков. 
Каждый ген - это байт, то есть он может принимать значения от 0 до 255
Как формируется изображение
Всё изображение формируется с помощью кружков.
Каждый сегмент растения - это просто множество кружков, нарисованных с небольшим смещением. При этом, при необходимости, каждый следующий кружок может иметь чуть другой цвет, размер или сместиться под другим углом. Длина сегмента определяется количеством кружков
Способ рисования - Агенты
Рисование растения производится с помощью агентов.
В начале рисования создаётся агент , имеющий направление вверх.
Он из генома получает данные, необходимые для отрисовки первого сегмента (level 0).
Например такие:
- размер кружка
- цвет кружка (три гена R,G,B)
- на сколько менять размер кружка на следующем шаге
- на сколько менять цвет кружка на следующем шаге (три гена R,G,B)
- на сколько менять направление кружка на следующем шаге
- сколько кружков нарисовать (длина сегмента)
- сколько потомков породить (количество ответвлений)
- под каким углом направить потомков
Каждый шаг агент рисует кружок заданного размера и цвета и смещается на три пикселя в нужном направлении.
Перед рисованием нового кружка агент производит изменения в цвете, размерах и в направлении, если это необходимо.
Когда агент нарисует необходимое количество кружков, он исчезает,
при этом вместо себя он создаёт от одного до трёх новых агентов и передаёт им свои координаты, а также цвет и размер последнего кружка.
Также задаёт новым агентам направление.
Новые агенты из генома получают данные, необходимые для отрисовки следующего уровня (level 1).
По окончании своей работы они создают агентов для отрисовки следующего уровня (level 2)
И так далее.
Агенты последнего уровня исчезают не порождая потомков.
На изображении пример нарисованных двух уровней.
В первом случае первоначальный агент породил одного агента следующего уровня, во втором и третьем случаях двух агентов и в последнем случае трёх. Также можно видеть результат действия гена, отвечающего за направление потомков.
Цвет и размер сегментов второго уровня резко отличаются от первого.
Иногда это полезно, но чаще всего нужно чтобы был плавный переход.
Для этого я ввел дополнительные гены:
- на сколько важен размер последнего кружка предка 
- на сколько важен цвет последнего кружка предка
Если ген "важность размера предка"  = 0, то размер предка полностью игнорируется и для отрисовки первого кружка на новом уровне используется то, что прописано в гене "размер" на этом уровне (рис 1).
Если "важность размера предка"  = 255, то значение  гена "размер" полностью игнорируется и используется размер, переданный предком (рис 2, 3, 4).
При промежуточных значениях в гене,  размер первого кружка на новом уровне вычисляется пропорционально.
Всё то же самое и с геном "важность цвета предка". На рисунке этот ген меняется от 0 до 255.
Вариативность
Теперь, если мы все параметры выставим на средний уровень, то у нас получиться что-то похожее на левое изображение. Оно не плохое, но хочется что-то более природное, как на правом изображении.
Для этого придётся добавить немного вариативности.
Этому служат несколько генов:
- вариативность цвета 
- вариативность размера (диаметр начального кружка)
- вариативность длины (количество кружков в сегменте)
- вариативность в направлении потомков
На рисунке: в левом варианте все гены, отвечающие за вариативность, выставлены в ноль, два других варианта имеют значения, отличные от нуля
Приведу пример с длиной сегмента:
Допустим, что ген "длина сегмента" = 30.
Если ген "вариативность длины" = 0, то длина сегмента = 30
Если ген "вариативность длины" = 255,
то длина сегмента равна 30 + random(-25, 25)
Если ген "вариативность длины" = 128,
то длина сегмента равна 30 + random(-12, 12)
Если ген "вариативность длины" = 60,
то длина сегмента равна 30 + random(-6, 6)
варианты отрисовки кружков
Чтобы изображение было более естественным и плавным, я использовал два варианта создания кружков
При создании плоского изображения сначала рисуется круг большего размера и поверх него круг с меньшей прозрачностью и с размером, соответствующим тому, что должен нарисовать агент.
Благодаря этому, линии получаются более мягкие и отдельные круги сливаются в единую линию
При создании псевдо 3d изображения сначала рисуются чёрный и белый полупрозрачные круги со смещением по диагонали и поверх них круг нужного цвета. Это придаёт некоторую объёмность.
пример плоского изображения
пример псевдо 3d изображения

Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden Описание алгоритма Digital Garden

Comments

<div ><div><span class="text">Степан, случайным образом берём каждый байт из одного растения или из другого. Каждый раз при скрещивании получается новый вариант, не похожий на другие</span></div></div>

foo52ru ТехноШаман

<div ><div><span class="text">А как же они скрещиваются?</span></div></div>

Степан


More Creators