Strona głównaArtykułySztuka Generatywna

Systemy L-owe: Tworzenie Fraktali z Gramatyki i Żabki

Niewielka liczba zasad rewritingu oraz żabka, która wie tylko jak iść do przodu, skręcać w lewo i w prawo, wystarczy do wygenerowania paproci, drzew, krzywych smoków i płatków śniegu.

mysimulator teamZaktualizowano — czerwiec 2026≈ 7 min czytania▶ Otwórz symulację

Przekształcanie alfabetu, generacja po generacji

System L (Lindenmayer system) to formalna gramatyka: zbiór symboli alfabetu, początkowa ciąg znaków zwana aksjomatem oraz zestaw reguł produkcji, które określają, jakim symbolem każdy symbol ma zostać zastąpiony. Aristid Lindenmayer wprowadził je w 1968 roku do modelowania wzrostu glonów. Kluczową różnicą od gramatyki Chomskiego używanej do parsowania języków programowania jest to, że każdy symbol w ciągu jest jednocześnie przekształcany, generacja po generacji, zamiast pojedynczej substytucji dokonanej na raz – co odzwierciedla sposób podziału każdej komórki w rosnącym organizmie w jednym momencie.

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)
demo na żywo · powiązana symulacja● LIVE

Grafika żółwiańska: przekształcanie symboli w geometrię

Przekazane zdanie nie ma znaczenia, dopóki nie zostanie narysowane, a to zadanie wykonuje żółw poruszający się po płótnie zgodnie z kolejnością znaków: F przesuwa się do przodu rysując linię, f przesuwa się do przodu bez rysowania, + i - skręcają żółwia w lewo lub prawo o stały kąt, a [ / ] cofają i wracają pozycję oraz kierunek żółwia na stos. Ten stos przekształca pojedynczy ciąg znaków w strukturę rozgałęzioną: żółw rysuje gałąź, cofaj się do punktu rozwidlenia i zaczynaj kolejną gałąź od dokładnie tego miejsca, z którego odszedł.

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()

Rozszerzenia stochastyczne i parametryczne

Prosta L-system jest dokładnie samościsła, co sprawia, że wygląda geometrycznie zamiast organicznie. Rozszerzenia stochastyczne korygują to, wprowadzając kilka możliwych zamian dla symbolu, każda z własną prawdopodobieństwem, dzięki czemu żadne dwie gałęzie nie rozwijają się identycznie – w ten sposób storp Barnsley'ego uzyskuje swój naturalny, nieregularny wygląd z czystego losowego wyboru reguły na każdym kroku. Rozszerzenia parametryczne przypisują numeryczne parametry do symboli (długość gałęzi, grubość, kąt), które kurczą się lub zmieniają z każdym pokoleniem, umożliwiając realistowe zwężanie się drzewa w miarę jego rozrastania się i kontekstowo zależne warianty pozwalają na to, aby zmiana symbolu zależała od jego sąsiadów, co oddaje wzrost między sąsiednimi komórkami poprzez sygnały hormonów roślinnych.

Przykłady i zasady działania

The simulation allows us to explore various celestial bodies, from planets like Earth and Mars to moons orbiting those planets. We can also simulate the movement of smaller objects, such as asteroids and comets, within our solar system.

To understand these systems, we need to consider fundamental physical laws, including Newton's law of universal gravitation. This law dictates how objects with mass attract each other – the greater the mass, the stronger the attraction, and the closer they are, the more significant the force. The simulation accurately models this interaction, allowing us to predict planetary orbits and gravitational effects.

Furthermore, we can incorporate concepts like orbital eccentricity, which describes the shape of an ellipse defining a planet's orbit. A value of 0 indicates a perfect circle, while values greater than 0 represent more elongated paths. The simulation allows for fine-tuning of these parameters to create realistic and varied planetary systems.

Finally, we can introduce factors such as atmospheric drag and tidal forces, which play crucial roles in the long-term evolution of planetary systems. These effects are computationally intensive but essential for creating a truly comprehensive simulation.

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

Dlaczego skaluje się: złożoność z krótkich ciągów znaków

Zasada, która zastępuje jeden symbol k symbolami, sprawia, że łańcuch rośnie w przybliżeniu jak k^n po n generacjach – wykładniczy wzrost z reguły, którą można zapisać na serwetce. To cała treść atrakcyjności modelu: kilka znaków gramatycznych, zastosowanych rekurencyjnie, generuje tę samą rodzajowość rozgałęzienia samo-podobieństwa, którą obserwują biologowie w rzeczywistych paprozkach, drzewach oskrzelowych i deltach rzecznych. Prusinkiewicz i Lindenmayer szczegółowo skatalogowali tę zależność w The Algorithmic Beauty of Plants, który do dziś jest standardowym źródłem dla każdego, kto buduje botanicznie wiarygodny system L.

Frequently asked questions

Co oznaczają kwadratowe nawiasy w regule L-system?

Wskazują one żółwiowi, aby zapisał lub przywrócił stan. [ zapisuje bieżącą pozycję i kąt na stosie; ] usuwa element z góry stosu, przywracając żółwiowi tę zapisaną pozycję i kąt. Dzięki temu pojedynczy ciąg znaków generuje rozgałęziony drzewo zamiast jednej ciągłej linii: żółw rysuje gałąź, nawiasy wracają do rozwidlenia i zaczyna kolejną gałąź z tego samego punktu.

Dlaczego drzewa L-system wyglądają bardziej jak prawdziwe rośliny niż ręcznie narysowane fraktale?

Aristid Lindenmayer pierwotnie zaprojektował L-systemy w 1968 roku, aby modelować sposób podziału i wzrostu rzeczywistych komórek alg i roślin, a nie tworzyć ładne obrazy. Rozszerzenia parametryczne i stochastyczne pozwalają na opadanie długości gałęzi z każdym generowaniem oraz na losowe wariacje kątów w określonym zakresie, co lepiej oddaje biologiczne zmienność wzrostu prawdziwych roślin niż sztywne, dokładnie samo-powtarzające się fraktale.

Dlaczego długość ciągu znaków rośnie tak szybko?

Ponieważ każdy symbol w ciągu znaków jest jednocześnie przepisywany w każdym generowaniu zgodnie z regułą produkcji. Jeśli reguła zastępuje jeden symbol przez k symboli, długość ciągu znaków przybliżeniu mnoży się przez k w każdym generowaniu, więc długość rośnie wykładniczo wraz z liczbą generacji, mimo że sama reguła ma tylko kilka znaków.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz L-System Fractals i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację L-System Fractals

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)