(продолжение, начало выше)
биолог Аристид Линденмайер в конце 1960-х придумал L-системы именно как модель для роста растений — и невозможно не написать про это два слова
сразу скажу, что есть отличная книжка Prusinkiewicz, Lindenmayer. The Algorithmic Beauty of Plants, http://algorithmicbotany.org/papers/#abop (спасибо Никите С. и Роме Г., советовавшим эту книжку) — и там все подробно step by step объясняется, лучшее мб вместо поста ее и читать )
===
3.
в предыдущем посте мы генерировали строки и смотрели на них как на описания путей (символ F означает «двигаться вперед», повороты кодируются символами + и -)
если хочется рисовать деревья, то полезно добавить какую-то возможность ветвления
для этого добавим такое правило для обработки символов [ и ]: после рисования фрагмента в квадратных скобках «черепашка» возвращается туда, где была в его начале
технически для этого в функцию turtleprint добавим
stack = []
…
if command == "[":
stack.append((x,y,heading))
if command == "]":
x,y,heading = stack.pop()
тогда дерево можно нарисовать в духе
seed="F"
rules={"F": "F[+F][-F]F"}
(стартуем с отрезка, на каждом шаге заменяем отрезок на цепочку из двух с растущими из середины в обе стороны ветками; на рисунке показано всего 2 шага)
получается, правда, такое совсем уж математическое дерево… чтобы сделать его более растительным, можно сделать два вида “клеток” — "F" пусть будет просто расти, а из "X" пусть происходит еще ветвление в разные стороны
seed="X"
rules={"F": "FF", "X": "F[+X][-X]FX"}
уже не так плохо, но слишком симметрично… перекосить можно так, скажем:
seed="X"
rules={"F": "FF", "X": "F-[[X]+X]+F[+FX]-X"}
(код целиком положу в комментарии)
***
(не слишком сложными) L-системами можно пользоваться и прямо в техе (в tikz есть для этого бибиотека):
\usetikzlibrary{lindenmayersystems}
\begin{tikzpicture}[rotate=65]
\draw[green!60!black] l-system[l-system={axiom=F,rule set={F -> F[+F]F[-F]}, order=4, angle=25,step=3pt}];
\end{tikzpicture}
но в питоне, конечно, легче менять любые правила игры по своему желанию
===
вижу иногда, как люди постят generative art, где код умещается примерно в один твит, а на картинках облака летят, деревья растут, вселенные встают и рушатся, и всё такое
здесь вещи довольно примитивные, но всё-таки от того, что вот такая одна строчка фактически рисует узнаваемое дерево (ну хорошо, куст), и вообще от темы в целом — такого же рода вайбы
