В этом посте я продолжу объяснять, как ваш компьютер может выращивать красивые деревья и растения. Вы можете найти первую часть, посвященную маленькой черепашке, которая занимается садоводством, в ЧАСТИ 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 г.