В этом посте я продолжу объяснять, как ваш компьютер может выращивать красивые деревья и растения. Вы можете найти первую часть, посвященную маленькой черепашке, которая занимается садоводством, в ЧАСТИ 1.

Напомню, что мы установили L-системы как так называемые порождающие грамматики. Это правила перезаписи, такие как: F -> F+F-. Мы можем применять эти правила итеративно столько раз, сколько захотим. Получившуюся строку вроде F+F-F+F- может прочесть маленькая послушная черепашка с карандашом. Черепаха движется либо Fвперед, либо поворачивает влево (+) или вправо (-) соответственно. Таким образом, он рисует красивые структуры, такие как кривая Коха:

Нашей черепахе нужна память

Тем не менее, это еще не очень похоже на растение. Наша система правил требует еще одной корректировки. Давайте теперь познакомимся с операторами открывающей и закрывающей скобки [ и ]. Тем самым мы добавляем к нашей черепашке особый тип памяти, также называемый стеком в компьютерных науках. Это означает, что всякий раз, когда черепаха читает [, она должна помнить свое текущее положение и ориентацию и помнить об этом. Если он наткнется на ], он должен вспомнить свое прежнее состояние из своей памяти и вернуться в запомненное положение и ориентацию, без рисования чего-либо на обратном пути. Другими словами, ] телепортирует черепаху туда, где она была до появления последнего [. С помощью этого простого дополнения наша черепашка может рисовать реалистично выглядящие растения. См. ниже полный набор различных грамматик и соответствующих растений:

На этом рисунке n — количество итераций, сигма — фиксированный угол поворота, символ X нужен только для грамматики. Рисующая черепаха игнорирует его. Изображение взято из [1]

Обратите внимание, что для некоторых растений здесь необходим символ X. Поскольку наша черепашка понятия не имеет,
что означает X, она просто проигнорирует его. Он используется только для генерации строк и не имеет отношения к чертежу. Кроме того, я написал небольшой скрипт на Python, который вы можете использовать для самостоятельного рисования этих растений, код опубликован в моем репозитории github.

Более продвинутые L-системы

Конечно, наши простые рисунки черепах — это не конец L-Systems. Мы могли бы изменить процесс рисования и разрешить трехмерное вращение, добавить цвет и добавить целые листья:

Изображение взято из [1]

И это действительно похоже на реалистичное растение.

Мы можем еще больше расширить нашу L-систему, введя случайность. Мы можем разрешить альтернативные правила для одного и того же начального символа. Выбор правил является случайным с определенной вероятностью:

A -> AB : 20%

A -> BA : 80%

Здесь A будет заменено на AB с вероятностью 20% и на BA в оставшихся 80% случаев. С помощью таких стохастических правил мы можем вводить вариации в наши растения:

Стохастические растения взяты из [1]

Хотя эти отдельные растения разные, вы можете подумать, что они принадлежат к одному и тому же виду.

В качестве следующего дополнения к нашей системе мы можем ввести контекстную чувствительность:

B<A>C -> ACA

В этом правиле A будет заменено на ACA только в том случае, если B можно найти слева, а C справа от A. Контекстно-зависимые растения выглядят, например, так:

Контекстно-зависимые растения из [1]

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

Наконец, мы можем еще больше усложнить нашу систему, введя параметризованные L-системы. Мы можем добавить логические и математические операторы, например:

A(t): t > 3 -> B(4t) C(t^2+sin(t),ln(t))

A будет заменено на BC, если t больше 3. Кроме того, t передается на B и C через некоторые сложные функции. С помощью таких математических параметризаций можно добавить модель среды обитания растения, например, питательные вещества в почве или источники света.

Например, мы можем смоделировать рост растений в ограниченном пространстве:

Изображение взято из [2]

Или развитие деревьев, которые конкурируют за солнечный свет и, следовательно, растут в противоположных направлениях:

Изображение взято из [3]

L-системы — это мощные инструменты для моделирования реалистичных растений. Они широко используются в науке, например, для исследования метаболизма деревьев [4] или роста корней [5]. L-системы не ограничиваются растениями, их также можно использовать для других природных явлений, таких как рост нервной ткани [6] или для создания реалистичных сценариев в компьютерных играх [7].

Наконец, напомню, что если вы хотите сами поиграть с L-Systems, я предоставил небольшой скрипт Python для этого в моем профиле на Github.

import turtle as t 
def init_turtle(): 
    ...

[1] П. Прусинкевич и А. Линденмайер, Алгоритмическая красота растений. Спрингер, 1990.

[2] П. Прусинкевич, М. Джеймс и Р. Мех, Синтетический топиарий, Материалы по компьютерной графике, 1994.

[3] Р. Мех и П. Прусинкевич, «Визуальные модели растений, взаимодействующих с окружающей средой», в материалах 23-й ежегодной конференции по компьютерной графике и интерактивным методам, сер. СИГГРАФ '96. Нью-Йорк, штат Нью-Йорк, США: ACM, 1996, стр. 397–410.

[4] М. Т. Аллен, П. Прусинкевич и Т. М. ДеДжонг, «Использование l-систем для моделирования взаимодействия источника и стока, архитектуры и физиологии растущих деревьев: модель l-персика», New Phytologist, vol. 166, нет. 3, стр. 869–880, 2005.

[5] Д. Лейтнер, С. Клепш, Г. Боднер и А. Шнепф, «Динамическая модель роста корневой системы, основанная на l-системах», «Растения и почва», том. 332, стр. 177–192, 2010, 10.1007/s11104–010–0284–7.

[6] Х. Елинек, А. Карпериен, Д. Корнфорт, RMC Junior, Дж. де Хесус Гомес, Р. Маркондес, К. Джуниор, Дж. Жезус и Г. Ле, «Micromod — системный подход к моделирование нейронов», Национальный университет, 2002, стр. 156–163.

[7] StackOverflow: L-Systems для выращивания моделей городов

Первоначально опубликовано на steemit.com 11 января 2018 г.