Пример переписывания системных узлов L
Это мой первый пост в стеке потока. Недавно я начал читать книгу "Алгоритмическая красота растений", где в главе 1 он объясняет систему L. (Вы можете прочитать главу здесь).
Итак, насколько я понимаю, существует два типа L-систем. Переписывание краев и переписывание узлов.
Переписывание краев относительно очень просто. Есть начальный полигон стартера и генератор. Каждое ребро (сторона) исходного многоугольника будет заменено генератором.
Но переписывание этого узла очень запутанно. Из того, что я собрал, есть два или более правил, и с каждой итерацией заменяйте переменные в правилах их постоянными аналогами.
С интерпретацией черепахи это стандартные правила
F : Move turtle forward in current direction (initial direction is up)
+ : rotate turtle clock wise
- : rotate turtle anti clock wise
[ : Push the current state of the turtle onto a pushdown operations stack.
The information saved on the stack contains the turtle’s position and orientation,
and possibly other attributes such as the color and width of lines being drawn.
] : Pop a state from the stack and make it the current state of the turtle
Так что рассмотрим пример, показанный на этом сайте. http://www.selcukergen.net/ncca_lsystems_research/lsystems.html
Axiom : FX
Rule : X= +F-F-F+FX
Angle : 45
так at n=0
(игнорировать X в аксиоме)
это просто F, что означает прямую линию, направленную вверх.
at n=1
заменить X в аксиоме с правилом
F + FF-F + F (снова игнорируя X в конце)
выход это
http://www.selcukergen.net/ncca_lsystems_research/images/noderewrite.jpg
простой пример с одним правилом в порядке. но в книге "Алгоритмическая красота растений" на странице 25 есть некоторые правила, которые я не знаю, как интерпретировать.
X
X = F[+X]F[-X]+X
F = FF
Смотрите это изображение.
https://lh6.googleusercontent.com/g3aPb1SQpvnzvDttsiiBgiUflrj7R2V29-D60IDahJs=w195-h344-no
at n=0
просто "Х". не уверен, что это значит
at n=1
применяя правило 1 (X-> F [+ X] F [-X] + X): F [+] F [-] + игнорируя все X. это просто прямая линия.
применяя правило 2 (F-> FF): FF [+] FF [-]. это просто прямая линия
Окончательный результат должен быть черепахой, перемещающейся четыре раза в направлении вверх, насколько я понимаю. Или, самое большее, окончательный результат должен содержать всего четыре строки.
Я нашел онлайн -генератор L-системы, который, как я думал, поможет мне лучше понять это, поэтому я ввел те же значения, и вот как выглядит результат при n=1
https://lh6.googleusercontent.com/-mj7x0OzoPk4/VK-oMHJsCMI/AAAAAAAAD3o/Qlk_02_goAU/w526-h851-no/Capture%2B2.PNG
выходной сигнал определенно не является прямой линией, и наихудшая часть состоит из 5 строк, что означает, что в конечном уравнении вывода должно быть 5 F
Помогите мне понять переписывание этого узла. Без понимания этого я не могу читать дальше в книгу.
Извините за длинный пост и за ссылки в предварительном теге. я не могу опубликовать более 2 ссылок. Спасибо за терпение читать его сверху донизу.
1 ответ
L-системы очень просты и основаны на подстановках текста.
С этой стартовой информацией:
Axiom : FX
Rule : X= +F-F-F+FX
Затем, в основном, для создания следующего поколения системы вы берете предыдущее поколение, и для каждого персонажа в ней вы применяете подстановки.
Вы можете использовать этот алгоритм для генерации поколения:
- Для каждого персонажа в предыдущем поколении:
- Проверьте, есть ли у нас правило замены для этого символа
- ДА: добавить замену
- НЕТ: добавить оригинальный символ
- Проверьте, есть ли у нас правило замены для этого символа
Таким образом:
n(0) = FX
+-- from the X
|
v---+---v
n(1) = F+F-F-F+FX
^
+- the original F
Если у вас было это начало вместо:
Axiom : ABA
Rule : A = AB
Тогда у вас будет это:
+--------+
| |
n(0) = ABA |
| | |
| ++ |
| | |
vv vv |
n(1) = ABBAB |
^ |
+-------+
В принципе:
- Для каждого A в поколении X при создании поколения X+1 выведите AB
- Для любого другого символа без правила просто выведите этот символ (это обрабатывает все буквы B)
Это будет система, которая удваивается по длине для каждого поколения:
Axiom : A
Rule : A = AA
создаст:
n(0) = A
n(1) = AA
n(2) = AAAA
n(3) = AAAAAAAA