Пример переписывания системных узлов 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
Другие вопросы по тегам