Переписування алфавіту, покоління за покоління
Л-система (Lindenmayer system) – це формальна граматика: алфавіт символів, початковий рядок, що називається аксіомою, та набір правил виробництва, які визначають, яким чином кожен символ має бути замінений. Арістід Лінденайер представив їх у 1968 році для моделювання росту водоростей. Ключова відмінність від граматики Чомського, що використовується для аналізу програмування, полягає в тому, що кожен символ у рядку одночасно переписується, покоління за поколінням, а не один символ замінюється за раз – що відповідає поділу кожної клітини в ростучому організмі одночасно.
axiom: F rule: F -> F+F--F+F angle: 60 degrees gen 0: F gen 1: F+F--F+F gen 2: F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F (Koch-style curve)
Графічні черепашки: перетворення символів на геометрію
Переписаний рядок означає нічого, поки його не намалюють, і це завдання виконує черепашка, яка рухається по канві, дотримуючись кожного символу в порядку: F – рух вперед з малюванням лінії, f – рух вперед без малювання, + і - повертають черепашку ліворуч або праворуч на фіквований кут, а [ / ] – відправляють та виймають позицію та напрямок черепашки зі стека. Цей стек перетворює окремий рядок на розгалужену структуру: черепашка малює один гілку, дужки повертаються до точки розгалуження, і починає наступну гілку з точно того місця, звідки вона відшліпувалась.
for symbol in string:
if symbol == 'F': drawLineForward(stepLength);
if symbol == 'f': moveForward(stepLength)
if symbol == '+': heading += angle
if symbol == '-': heading -= angle
if symbol == '[': stack.push({pos, heading})
if symbol == ']': {pos, heading} = stack.pop()
Стихійні та параметричні розширення
Проста Л-система є точно самосхожою, що виглядає геометрично, а не органічно. Стихійні Л-системи виправляють це, надаючи декілька можливих замін для символу, кожен з власним рівнем ймовірності, щоб жодні дві гілки не розгорталися однаково — таким чином бамслеївська папороть отримує свій природний, неправильний вигляд від чисто випадкового вибору правил на кожному кроці. Параметричні Л-системи прикріплюють числові параметри до символів (довжина гілки, товщина, кут), які зменшуються або змінюються з кожним поколінням, дозволяючи дереву гілці реалістично звужуватися, коли вона росте назовні, і контекстно-чутливі варіанти дозволяють символу переписуватись залежно від його сусідів, що приблизно відповідає тому, як справжні гормони рослин сигналізують про ріст між сусідніми клітинами.
Прикладні приклади та їх правила
The Mandelbrot set is a famous example of chaos theory, demonstrating how complex patterns can emerge from simple equations. It's generated by repeatedly applying the function f(z) = z^2 + c to a complex number 'z', where 'c' is a constant.
The Julia sets are closely related to the Mandelbrot set and also arise from iterating the same quadratic equation. Each Julia set corresponds to a different value of 'c'.
Fractal geometry, pioneered by Benoît Mandelbrot, provides a framework for understanding these self-similar patterns found throughout nature. The concept of iteration is central to fractal generation.
The logistic map is another example of a simple iterative equation that can produce complex and unpredictable behavior, often exhibiting chaotic dynamics.
Koch snowflake F->F+F--F+F angle 60 Dragon curve X->X+YF+ Y->-FX-Y angle 90 Sierpinski tri. F->G-F-G G->F+G+F angle 60 Barnsley fern (parametric, 4 stochastic affine transforms) Hilbert curve A->-BF+AFA+FB- B->+AF-BFB-FA+ angle 90
Чому це масштабується: складність з коротких рядків
Правило, яке замінює один символ на k символів, робить рядок зростати приблизно як k^n після n поколінь – експоненційне зростання з правила, яке можна записати серветкою. Це вся суть моделі: кілька символів граматики, застосовані рекурсивно, генерують той самий тип розгалужень та самоподібність, який спостерігається біологами у справжніх папоротях, бронхіальних деревах і річкових дельтах. Прусінкевіч і Ліндемайер детально задокументували цю зв’язку в The Algorithmic Beauty of Plants, яка досі є основним посиланням для будь-кого, хто будує ботанічно правдоподібну L-систему.
Frequently asked questions
Що означають квадратні дужки в правилі L-системи?
Вони повідомляють черепахові зберегти або відновити своє положення. [ записує поточне положення та напрямок на стек; ] зчитує стек, повертаючи черепахову до збереженого положення та напрямку. Саме це дозволяє одному рядку генерувати розгалужене дерево замість однієї безперервної лінії: черепаха малює гілку, повертається до розгалуження і починає наступну гілку з того ж місця.
Чому дерева L-системи виглядають більш як справжні рослини, ніж нарисовані фрактали?
Арістід Лайденмайер спочатку розробив L-системи у 1968 році для моделювання того, як діляться та ростуть справжні водорості та клітини рослин, а не для створення красивих картинок. Параметричні та стохастичні розширення дозволяють регулювати товщину гілок з кожним поколінням і випадково змінювати кути в межах певного діапазону, що краще відтворює біологічну варіативність справжнього росту, ніж жорсткий, точно самосхожий фрактал.
Чому довжина рядка так швидко зростає?
Оскільки кожен символ у рядку одночасно переписується згідно зі своїм правилом виробництва в кожному поколінні, якщо правило замінює один символ на k символів, то довжина рядка приблизно множиться на k кожного покоління, тому довжина зростає експоненційно залежно від кількості поколінь, незважаючи на те, що само по собі правило складається лише з кількох символів.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте L-System Fractals і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію L-System Fractals