Přeskočit na obsah

L-systém: Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
m WPCleaner v1.30 - Opraveno pomocí WP:WCW - Opravy pravopisu a typografie - Popis odkazu před i za jeho koncem / Zbývající odkaz - Polygon
m →‎Kontextové L-systémy: typografie za použití AWB
 
(Není zobrazeno 14 mezilehlých verzí od 10 dalších uživatelů.)
Řádek 1: Řádek 1:
{{Dobrý článek}}
{{Dobrý článek}}
[[Image:Fractal weeds.jpg|thumb|300px|Traviny vymodelované pomocí L-systémů ve 3D]]
[[Soubor:Fractal weeds.jpg|náhled|300px|Traviny vymodelované pomocí L-systémů ve 3D]]
'''L-systém''' nebo také '''[[Aristid Lindenmayer|Lindenmayerův]] systém''' je varianta [[Formální gramatika|formální gramatiky]], vyvinutá pro modelování růstu [[Rostliny|rostlin]]. L-systém popisuje [[Formální gramatika|pravidla]] pro vývoj rostliny, která se opakovaně aplikují na vznikající [[Model (abstrakce)|model]]. Tato pravidla mohou např. popisovat, za jakých podmínek se [[stonek]] rostliny rozdvojí, zda má vzniknout [[list]] nebo zda má část rostliny uhynout. Výsledný model se může např. vykreslit jako [[Digitální obraz|obrázek]] nebo se z něj vytvoří počítačový [[Počítačová 3D grafika|3D model]] rostliny. L-systémy se také dají použít pro generování různých [[křivka|křivek]], [[fraktál]]ů nebo pro modelování [[buňka|buněčných]] [[organismus|organismů]].
'''L-systém''' nebo také '''[[Aristid Lindenmayer|Lindenmayerův]] systém''' je varianta [[Formální gramatika|formální gramatiky]], vyvinutá pro modelování růstu [[Rostliny|rostlin]]. L-systém popisuje [[Formální gramatika|pravidla]] pro vývoj rostliny, která se opakovaně aplikují na vznikající [[Model (abstrakce)|model]]. Tato pravidla mohou např. popisovat, za jakých podmínek se [[stonek]] rostliny rozdvojí, zda má vzniknout [[list]] nebo zda má část rostliny uhynout. Výsledný model se může např. vykreslit jako [[Digitální obraz|obrázek]] nebo se z něj vytvoří počítačový [[Počítačová 3D grafika|3D model]] rostliny. L-systémy se také dají použít pro generování různých [[křivka|křivek]], [[fraktál]]ů nebo pro modelování [[buňka|buněčných]] [[organismus|organismů]].
<ref>{{Citace monografie
<ref>{{Citace monografie
Řádek 74: Řádek 74:
| strany = 301–308
| strany = 301–308
| isbn = 1-58113-374-X
| isbn = 1-58113-374-X
| url-access = registration
| url = https://archive.org/details/siggraph2001conf00fium
}}</ref> nebo pomocí L-systémů lze popisovat podrozdělování (zjemňování) křivek<ref>{{Citace monografie
}}</ref> nebo pomocí L-systémů lze popisovat podrozdělování (zjemňování) křivek<ref>{{Citace monografie
| titul = L-system description of subdivision curves
| titul = L-system description of subdivision curves
Řádek 94: Řádek 96:
| datum přístupu = 2012-03-01
| datum přístupu = 2012-03-01
| jazyk = anglicky
| jazyk = anglicky
| url archivu = https://web.archive.org/web/20120222212202/http://www.tursiops.cc/fm/
}}</ref><ref>{{Citace monografie
| datum archivace = 2012-02-22
| nedostupné = ano
}}</ref><ref>{{Citace monografie
| titul = Musical L-systems
| titul = Musical L-systems
| vydavatel = Nepublikovaná magisterská práce, Institute of Sonology, Hague
| vydavatel = Nepublikovaná magisterská práce, Institute of Sonology, Hague
Řádek 113: Řádek 118:
** pro symbol <math>b \in \Sigma</math>, který se neobjevuje na levé straně žádného přepisovacího pravidla, je definována [[Identita (matematika)|identita]] (<math>b \rightarrow b</math>) (takové symboly jsou často označovány jako [[konstanta|konstanty]]).
** pro symbol <math>b \in \Sigma</math>, který se neobjevuje na levé straně žádného přepisovacího pravidla, je definována [[Identita (matematika)|identita]] (<math>b \rightarrow b</math>) (takové symboly jsou často označovány jako [[konstanta|konstanty]]).


D0L-systém je velice podobný [[deterministická bezkontextová gramatika|deterministické bezkontextové gramatice]]. Liší se například v tom, že gramatika rozlišuje [[Terminální symbol|terminální]] a [[Neterminální symbol|neterminální]] symboly, ale L-systém pro neterminály definuje identitu jako výchozí přepisovací pravidlo. Další rozdíl je v tom, že gramatika má jako semínko jeden neterminální symbol, ale L-systém povoluje neprázdné slovo (libovolný konečný [[Slovo (formální jazyky)|řetězec]] symbolů).
D0L-systém je velice podobný [[deterministická bezkontextová gramatika|deterministické bezkontextové gramatice]]. Liší se například v tom, že gramatika rozlišuje [[Terminální symbol|terminální]] a [[neterminální symbol]]y, ale L-systém pro neterminály definuje identitu jako výchozí přepisovací pravidlo. Další rozdíl je v tom, že gramatika má jako semínko jeden neterminální symbol, ale L-systém povoluje neprázdné slovo (libovolný konečný [[Slovo (formální jazyky)|řetězec]] symbolů).


Každý symbol z abecedy je obvykle reprezentován jedním [[Znak (počítače)|znakem]] ([[Písmeno|písmenem]]), což značně ulehčuje a zrychluje zápis. Avšak existují i speciální symboly, které jsou zapsány více znaky. Jsou to většinou velmi specifické symboly pro interpretaci. Aby se rozlišily vícepísmenné symboly, dává se před ně nějaký speciální [[Předpona|prefix]], např. [[zavináč]]. Ten pak není součástí abecedy.
Každý symbol z abecedy je obvykle reprezentován jedním [[Znak (počítače)|znakem]] ([[Písmeno|písmenem]]), což značně ulehčuje a zrychluje zápis. Avšak existují i speciální symboly, které jsou zapsány více znaky. Jsou to většinou velmi specifické symboly pro interpretaci. Aby se rozlišily vícepísmenné symboly, dává se před ně nějaký speciální [[prefix]], např. [[zavináč]]. Ten pak není součástí abecedy.
<ref>{{Citace monografie
<ref>{{Citace monografie
| titul = Hairs, Textures, and Shades: Improving the Realism of Plant Models Generated with L-Systems
| titul = Hairs, Textures, and Shades: Improving the Realism of Plant Models Generated with L-Systems
Řádek 181: Řádek 186:
: 1, 1, 2, 3, 5, 8, 13, 21, …
: 1, 1, 2, 3, 5, 8, 13, 21, …


Výstupní řetězec má stejnou vlastnost, která platí pro Fibonacciho posloupnost, tj. ''i''-té číslo (<math>i>1</math>) je součtem předchozích dvou. Tedy ''i''-tá iterace tvořena spojením iterací <math>i-2</math> a <math>i-1</math>. Malou změnou druhého přepisovacího pravidla na (<tt>B&nbsp;→&nbsp;BA</tt>) bude výsledek splňovat stejné vlastnosti jako původní, jen se budou iterace spojovat &bdquo;popořadě&ldquo;, tedy ''i''-tá iterace bude tvořena spojením iterací <math>i-1</math> a <math>i-2</math>. Z toho vyplývá i to, že délky jednotlivých iterací budou také odpovídat číslům ve Fibonacciho posloupnosti. Tato odlišnost ve Fibonacciho posloupnosti není, protože sčítání dvou [[Číslo|čísel]] je [[Komutativita|komutativní]].
Výstupní řetězec má stejnou vlastnost, která platí pro Fibonacciho posloupnost, tj. ''i''-té číslo (<math>i>1</math>) je součtem předchozích dvou. Tedy ''i''-tá iterace tvořena spojením iterací <math>i-2</math> a <math>i-1</math>. Malou změnou druhého přepisovacího pravidla na (<tt>B&nbsp;→&nbsp;BA</tt>) bude výsledek splňovat stejné vlastnosti jako původní, jen se budou iterace spojovat „popořadě“, tedy ''i''-tá iterace bude tvořena spojením iterací <math>i-1</math> a <math>i-2</math>. Z toho vyplývá i to, že délky jednotlivých iterací budou také odpovídat číslům ve Fibonacciho posloupnosti. Tato odlišnost ve Fibonacciho posloupnosti není, protože sčítání dvou [[Číslo|čísel]] je [[Komutativita|komutativní]].


Další zajímavou vlastností řetězců v příkladech 1 a 2 je úzká souvislost se [[Zlatý řez|zlatým řezem]]. Pro <math>i>0</math> platí, že symbol na ''k''-tém místě od neměnného konce (&bdquo;začátek&ldquo; u př. 1, &bdquo;konec&ldquo; u př. 2) je buď <tt>A</tt> nebo <tt>B</tt>, podle toho, zda nějaký celočíselný násobek zlatého řezu padne (náleží) do [[Otevřený interval|otevřeného intervalu]] <math>(k, k+1)</math>. Poměr počtu symbolů <tt>A</tt> a <tt>B</tt> tedy pro <math>i \rightarrow \infty</math> [[Konvergentní posloupnost|konverguje]] k hodnotě zlatého řezu
Další zajímavou vlastností řetězců v příkladech 1 a 2 je úzká souvislost se [[Zlatý řez|zlatým řezem]]. Pro <math>i>0</math> platí, že symbol na ''k''-tém místě od neměnného konce („začátek“ u př. 1, „konec“ u př. 2) je buď <tt>A</tt> nebo <tt>B</tt>, podle toho, zda nějaký celočíselný násobek zlatého řezu padne (náleží) do [[Otevřený interval|otevřeného intervalu]] <math>(k, k+1)</math>. Poměr počtu symbolů <tt>A</tt> a <tt>B</tt> tedy pro <math>i \rightarrow \infty</math> [[Konvergentní posloupnost|konverguje]] k hodnotě zlatého řezu


<math>\varphi = {1+\sqrt5 \over 2} \approx 1,618.</math>
<math>\varphi = {1+\sqrt5 \over 2} \approx 1,618.</math>
Řádek 210: Řádek 215:


=== Vykreslování ve 2D ===
=== Vykreslování ve 2D ===
[[Image:Kturtle side view.svg|thumb|200px|Představa, jak želva něco kreslí (želví grafika)]]
[[Soubor:Kturtle side view.svg|náhled|200px|Představa, jak želva něco kreslí (želví grafika)]]
Obvyklá (a jedna z nejjednodušších) je interpretace pomocí [[Želví grafika|želví grafiky]]. Tato interpretace chápe symboly jako příkazy pro ''štětec'' (želvu nesoucí štětec), který podle nich kreslí [[Úsečka|úsečky]] a vyplněné [[Mnohoúhelník|polygony]] v [[Rovina|rovině]]. Interpretace probíhá dvoufázově, nejprve se L-systém vygeneruje (''vyiteruje'') do požadované iterace a poté se výsledek interpretuje (kreslí). Pro první fázi musí být zadán počet iterací a pro druhou výchozí stav štětce (želvy). Ten v nejjednodušší variantě obsahuje ''délku kroku'' a ''úhel otočení'' štětce, ale může obsahovat i různé další údaje, jako např. barvu nebo šířku štětce. Během druhé fáze interpretace je také udržován ''stav štětce'' v rovině, tedy v jakém místě se nachází a jak je orientován. V následující tabulce je shrnuta obvyklá interpretace symbolů ve druhé fázi. Tyto příkazy dávají rozkazy štětci (želvě).
Obvyklá (a jedna z nejjednodušších) je interpretace pomocí [[Želví grafika|želví grafiky]]. Tato interpretace chápe symboly jako příkazy pro ''štětec'' (želvu nesoucí štětec), který podle nich kreslí [[Úsečka|úsečky]] a vyplněné [[Mnohoúhelník|polygony]] v [[Rovina|rovině]]. Interpretace probíhá dvoufázově, nejprve se L-systém vygeneruje (''vyiteruje'') do požadované iterace a poté se výsledek interpretuje (kreslí). Pro první fázi musí být zadán počet iterací a pro druhou výchozí stav štětce (želvy). Ten v nejjednodušší variantě obsahuje ''délku kroku'' a ''úhel otočení'' štětce, ale může obsahovat i různé další údaje, jako např. barvu nebo šířku štětce. Během druhé fáze interpretace je také udržován ''stav štětce'' v rovině, tedy v jakém místě se nachází a jak je orientován. V následující tabulce je shrnuta obvyklá interpretace symbolů ve druhé fázi. Tyto příkazy dávají rozkazy štětci (želvě).


Řádek 221: Řádek 226:
| <tt>a</tt>-<tt>u</tt> || „Pohni se vpřed (bez kreslení).“ (délka pohybu je ''délka kroku'')
| <tt>a</tt>-<tt>u</tt> || „Pohni se vpřed (bez kreslení).“ (délka pohybu je ''délka kroku'')
|-
|-
| <tt>V</tt>-<tt>Z</tt>, <tt>v</tt>-<tt>Z</tt> || „Nedělej nic.“, obvykle se jedná o písmena ke konci abecedy, hranice není ustálena (používá se pro potřeby vývoje L-systému)
| <tt>V</tt>-<tt>Z</tt>, <tt>v</tt>-z || „Nedělej nic.“, obvykle se jedná o písmena ke konci abecedy, hranice není ustálena (používá se pro potřeby vývoje L-systému)
|-
|-
| <tt>+</tt>, <tt>-</tt> || „Otoč se doleva (resp. doprava) o předem stanovený úhel.“ (o ''úhel otočení'')
| <tt>+</tt>, <tt>-</tt> || „Otoč se doleva (resp. doprava) o předem stanovený úhel.“ (o ''úhel otočení'')
Řádek 241: Řádek 246:


=== Vykreslování ve 3D ===
=== Vykreslování ve 3D ===
Výše uvedená [[2D]] interpretace se dá jednoduše rozšířit do [[3D]]. ''Štětec'' se bude pohybovat v [[Prostor (geometrie)|prostoru]] místo v rovině. Stav bude podobný, tedy bude to poloha a orientace v prostoru. Pro pohyb v trojrozměrném prostoru je třeba více příkazů pro otočení, protože se dá otáčet podle 3 [[Osa|os]] (ve 2D je pouze 1 osa). V následující tabulce je seznam interpretací symbolů, které je potřeba přidat.
Výše uvedená [[2D]] interpretace se dá jednoduše rozšířit do [[3D]]. ''Štětec'' se bude pohybovat v [[Prostor (geometrie)|prostoru]] místo v rovině. Stav bude podobný, tedy bude to poloha a orientace v prostoru. Pro pohyb v trojrozměrném prostoru je třeba více příkazů pro otočení, protože se dá otáčet podle 3 [[Osa|os]] (ve 2D je pouze 1 osa). V následující tabulce je seznam interpretací symbolů, které je potřeba přidat.


[[image:Roll, yaw, pitch.jpg|thumb|200px|Graficky znázorněné otáčení ve 3D]]
[[Soubor:Roll, yaw, pitch.jpg|náhled|200px|Graficky znázorněné otáčení ve 3D]]
{| class="wikitable"
{| class="wikitable"
|-
|-
! Symboly !! Interpretace
! Symboly !! Interpretace
|-
|-
| <tt>+</tt>, <tt>-</tt> || &bdquo;otoč se doleva (resp. doprava) o předem stanovený úhel&ldquo; (stejné jako ve 2D), pokud si představíte ''štětec'' jako [[letadlo]] a směr ''štětce'' jako směr letu letadla, pak tyto symboly představují zahýbání letadla doleva a doprava, z pohledu pilota (angl. ''yaw'' viz obr.)
| <tt>+</tt>, <tt>-</tt> || „otoč se doleva (resp. doprava) o předem stanovený úhel“ (stejné jako ve 2D), pokud si představíte ''štětec'' jako [[letadlo]] a směr ''štětce'' jako směr letu letadla, pak tyto symboly představují zahýbání letadla doleva a doprava, z pohledu pilota (angl. ''yaw'' viz obr.)
|-
|-
| <tt>^</tt>, <tt>&</tt> || &bdquo;otoč se nahoru (resp. dolů) o předem stanovený úhel&ldquo;, u letadla by to znamenalo stoupání a klesání (angl. ''pitch'' viz obr.)
| <tt>^</tt>, <tt>&</tt> || „otoč se nahoru (resp. dolů) o předem stanovený úhel“, u letadla by to znamenalo stoupání a klesání (angl. ''pitch'' viz obr.)
|-
|-
| <tt>/</tt>, <tt>\</tt> || &bdquo;otoč se doleva (resp. doprava) podle osy určené mým směrem o předem stanovený úhel&ldquo;, u letadla by tyto příkazy vypadaly jako &bdquo;výkrut&ldquo;, otáčení podél osy letu (angl. ''roll'' viz obr.)
| <tt>/</tt>, <tt>\</tt> || „otoč se doleva (resp. doprava) podle osy určené mým směrem o předem stanovený úhel“, u letadla by tyto příkazy vypadaly jako „výkrut“, otáčení podél osy letu (angl. ''roll'' viz obr.)
|}
|}


== Příklady L-systémů ==
== Příklady L-systémů ==
=== Kochova vločka ===
=== Kochova vločka ===
[[Image:KochTurtleAnim.gif|thumb|Animace interpretace L-systému želví grafikou]]
[[Soubor:KochTurtleAnim.gif|náhled|Animace interpretace L-systému želví grafikou]]
Následující předpis vygeneruje část [[Kochova vločka|Kochovy vločky]].
Následující předpis vygeneruje část [[Kochova vločka|Kochovy vločky]].


Řádek 268: Řádek 273:
''pozn.: výchozí poloha štětce (želvy) je vlevo dole a štětec je orientován vpravo''
''pozn.: výchozí poloha štětce (želvy) je vlevo dole a štětec je orientován vpravo''


:''i'' = 0: <tt>F</tt>
:''i'' = 0: <tt>F</tt>
:[[Image:KochCurve0.svg|0. generace (axiom) Kochovy vločky]]
:[[Soubor:KochCurve0.svg|0. generace (axiom) Kochovy vločky]]


:''i'' = 1: <tt>F+F--F+F</tt>
:''i'' = 1: <tt>F+F--F+F</tt>
:[[Image:KochCurve1.svg|1. generace Kochovy vločky]]
:[[Soubor:KochCurve1.svg|1. generace Kochovy vločky]]


:''i'' = 2: <tt>F+F--F+F + F+F--F+F-- F+F--F+F + F+F--F+F</tt>
:''i'' = 2: <tt>F+F--F+F + F+F--F+F-- F+F--F+F + F+F--F+F</tt>
:[[Image:KochCurve2.svg|2. generace Kochovy vločky]]
:[[Soubor:KochCurve2.svg|2. generace Kochovy vločky]]


:''i'' = 3: <tt>F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F + F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F -- F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F + F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F</tt>
:''i'' = 3: <tt>F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F + F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F -- F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F + F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F</tt>
:[[Image:KochCurve3.svg|3. generace Kochovy vločky]]
:[[Soubor:KochCurve3.svg|3. generace Kochovy vločky]]


=== Stromeček ===
=== Stromeček ===
Řádek 298: Řádek 303:
Na následujícím obrázku můžete vidět prvních 6 iterací i s grafickým znázorněním přepisovacích pravidel.
Na následujícím obrázku můžete vidět prvních 6 iterací i s grafickým znázorněním přepisovacích pravidel.


[[image:LsystemTree.svg|Prvních 6 iterací fraktálu stromečku]]
[[Soubor:LsystemTree.svg|Prvních 6 iterací fraktálu stromečku]]


=== Ostrovy a jezera ===
=== Ostrovy a jezera ===
[[image:IslandsAndLakesRewriteRule.svg|thumb|200px|Graficky znázorněné přepisovací pravidlo L-systému Ostrovy a jezera]]
[[Soubor:IslandsAndLakesRewriteRule.svg|náhled|200px|Graficky znázorněné přepisovací pravidlo L-systému Ostrovy a jezera]]
Další [[fraktál]] generovaný pomocí L-systémů se jmenuje ''&bdquo;Ostrovy a jezera&ldquo;'' (z angl. '' &bdquo;Islands and lakes&ldquo;''). Jeho předpis můžete také nalézt v knize ''The Algorithmic Beauty of Plants'' na str. 9.<ref name="abop" />
Další [[fraktál]] generovaný pomocí L-systémů se jmenuje ''„Ostrovy a jezera“'' (z angl. '' „Islands and lakes“''). Jeho předpis můžete také nalézt v knize ''The Algorithmic Beauty of Plants'' na str. 9.<ref name="abop" />


{{L-systém
{{L-systém
Řádek 314: Řádek 319:
Výše uvedený předpis pro jednoduchost kreslí pouze hranice [[ostrov]]ů a [[Jezero|jezer]]. Avšak pro lepší představu byl následující obrázek vygenerován rozšířeným předpisem o příkazy, které generují [[polygon]]y.
Výše uvedený předpis pro jednoduchost kreslí pouze hranice [[ostrov]]ů a [[Jezero|jezer]]. Avšak pro lepší představu byl následující obrázek vygenerován rozšířeným předpisem o příkazy, které generují [[polygon]]y.


[[image:IslandsAndLakesColored.svg|400px|3. iterace L-systému Ostrovy a jezera]]
[[Soubor:IslandsAndLakesColored.svg|400px|3. iterace L-systému Ostrovy a jezera]]


=== Penroseovo dláždění ===
=== Penroseovo dláždění ===
Řádek 324: Řádek 329:
| rrp0 = M | rrr0 = O++{.P.----N.[-O.----M.}]++
| rrp0 = M | rrr0 = O++{.P.----N.[-O.----M.}]++
| rrp1 = N | rrr1 = +{.O.--P.[---M.--N.}]+
| rrp1 = N | rrr1 = +{.O.--P.[---M.--N.}]+
| rrp2 = O | rrr2 = -{.M.++N.[+++O.++P.}]-
| rrp2 = O | rrr2 = -<nowiki/>{.M.++N.[+++O.++P.}]-
| rrp3 = P | rrr3 = --{.O.++++M.[+P.++++N.}]--N
| rrp3 = P | rrr3 = --{.O.++++M.[+P.++++N.}]--N
| uhel = 36
| uhel = 36
Řádek 339: Řádek 344:


=== Gosperova křivka ===
=== Gosperova křivka ===
[[image:HexaGosperCurveRewriteRule.svg|thumb|200px|Vizualizace přepisovacího pravidla Gosperovy křivky]]
[[Soubor:HexaGosperCurveRewriteRule.svg|náhled|200px|Vizualizace přepisovacího pravidla Gosperovy křivky]]
Následující křivka, která je pojmenovaná po [[Amerika|americkém]] [[matematik]]ovi a [[programátor]]ovi jménem [[Bill Gosper]], splňuje definici [[Peanovy křivky#Plochu-vyplňující křivky|plochu-vyplňující křivky]] a také [[Peanovy křivky#FASS křivky|FASS křivky]].
Následující křivka, která je pojmenovaná po [[Amerika|americkém]] [[matematik]]ovi a [[programátor]]ovi jménem [[Bill Gosper]], splňuje definici [[Peanovy křivky#Plochu-vyplňující křivky|plochu-vyplňující křivky]] a také [[Peanovy křivky#FASS křivky|FASS křivky]].


Řádek 352: Řádek 357:
Na následujícím obrázku je 5. iterace Gosperovy křivky plynule obarvena celým [[Barevné spektrum|barevným spektrem]] od červené až po fialovou. Díky tomu lze vidět, kudy a jak křivka vede.
Na následujícím obrázku je 5. iterace Gosperovy křivky plynule obarvena celým [[Barevné spektrum|barevným spektrem]] od červené až po fialovou. Díky tomu lze vidět, kudy a jak křivka vede.


[[image:HexaGosperCurveColored.svg|5. iterace Gosperovy křivky obarvená celým barevným spektrem od červené po fialovou a zpět k červené pro lepší pozorování jejího vývoje]]
[[Soubor:HexaGosperCurveColored.svg|5. iterace Gosperovy křivky obarvená celým barevným spektrem od červené po fialovou a zpět k červené pro lepší pozorování jejího vývoje]]


== Parametrické L-systémy ==
== Parametrické L-systémy ==
Řádek 385: Řádek 390:
! Symboly !! Interpretace, kde 1. parametr má hodnotu ''X''
! Symboly !! Interpretace, kde 1. parametr má hodnotu ''X''
|-
|-
| <tt>A</tt>-<tt>U</tt>,<tt>0</tt>-<tt>9</tt> || &bdquo;nakresli úsečku ve směru natočení o délce ''X''&ldquo;
| <tt>A</tt>-<tt>U</tt>,<tt>0</tt>-<tt>9</tt> || „nakresli úsečku ve směru natočení o délce ''X''
|-
|-
| <tt>a</tt>-<tt>u</tt> || &bdquo;pohni se ve směru natočení bez kreslení o ''X''&ldquo;
| <tt>a</tt>-<tt>u</tt> || „pohni se ve směru natočení bez kreslení o ''X''
|-
|-
| <tt>+</tt>, <tt>-</tt> || &bdquo;otoč se doleva (resp. doprava) o ''X''&ldquo;
| <tt>+</tt>, <tt>-</tt> || „otoč se doleva (resp. doprava) o ''X''
|}
|}


Řádek 398: Řádek 403:
! Zápis !! Interpretace
! Zápis !! Interpretace
|-
|-
| <tt>F(1, 2)</tt> || &bdquo;nakresli úsečku ve směru natočení o délce 1&ldquo;
| <tt>F(1, 2)</tt> || „nakresli úsečku ve směru natočení o délce 1“
|-
|-
| <tt>+(80)</tt> || &bdquo;otoč se doleva (resp. doprava) o 80°&ldquo;
| <tt>+(80)</tt> || „otoč se doleva (resp. doprava) o 80°
|-
|-
| <tt>F</tt> resp. <tt>F()</tt> || &bdquo;nakresli úsečku ve směru natočení o výchozí délce&ldquo;
| <tt>F</tt> resp. <tt>F()</tt> || „nakresli úsečku ve směru natočení o výchozí délce“
|-
|-
| <tt>+(,0)</tt> || &bdquo;otoč se doleva (resp. doprava) o výchozí úhel zadaný L-systémem&ldquo;
| <tt>+(,0)</tt> || „otoč se doleva (resp. doprava) o výchozí úhel zadaný L-systémem“
|}
|}


=== Příklady ===
=== Příklady ===
[[image:H-tree-rooted.svg|thumb|200px|10. iterace H-stromu s parametry R = 1/√2 a U = 90]]
[[Soubor:H-tree-rooted.svg|náhled|200px|10. iterace H-stromu s parametry R = 1/√2 a U = 90]]
Jako jednoduchý příklad parametrického L-systému poslouží [[fraktál]] jménem [[H-strom]]. Říká se mu tak proto, že pro vhodně zvolené hodnoty ''proměnných'' vypadá jako písmena ''H'' tvořená z písmen ''H'', tvořená z písmen ''H''…
Jako jednoduchý příklad parametrického L-systému poslouží [[fraktál]] jménem [[H-strom]]. Říká se mu tak proto, že pro vhodně zvolené hodnoty ''proměnných'' vypadá jako písmena ''H'' tvořená z písmen ''H'', tvořená z písmen ''H''…


Řádek 419: Řádek 424:
}}
}}


''R'' a ''U'' jsou ''proměnné'' L-systému (nejsou to symboly abecedy, ani nemají nic společného s parametrickými L-systémy). Pro jejich různé hodnoty bude výsledek vypadat odlišně. Obvyklými hodnotami jsou ''R'' = 1/√2 a ''U'' = 90. Zajímavé je, že s těmito hodnotami tvoří H-strom [[Peanovy křivky|plochu-vyplňující]] L-systém (a je dokonce v kategorii ''[[Peanovy křivky|FASS]]''). Mírně odlišný výsledek vznikne s hodnotami ''R'' = 0,69 a ''U'' = 85, na následujícím obrázku je jeho 10. iterace. Pro hodnoty proměnných ''R'' = 1/√2 a ''U'' = 45 vznikne [[Pythagorův strom]].
''R'' a ''U'' jsou ''proměnné'' L-systému (nejsou to symboly abecedy, ani nemají nic společného s parametrickými L-systémy). Pro jejich různé hodnoty bude výsledek vypadat odlišně. Obvyklými hodnotami jsou ''R'' = 1/√2 a ''U'' = 90. Zajímavé je, že s těmito hodnotami tvoří H-strom [[Peanovy křivky#Plochu-vyplňující křivky|plochu-vyplňující]] L-systém (a je dokonce v kategorii ''[[Peanovy křivky#FASS křivky|FASS]]''). Mírně odlišný výsledek vznikne s hodnotami ''R'' = 0,69 a ''U'' = 85, na následujícím obrázku je jeho 10. iterace. Pro hodnoty proměnných ''R'' = 1/√2 a ''U'' = 45 vznikne [[Pythagorův strom]].

[[image:H-tree-85.svg|H-strom s parametry R = 0,99 a U = 85]]


[[Soubor:H-tree-85.svg|H-strom s parametry R = 0,99 a U = 85]]


Praktičtější ukázkou parametrických L-systémů je následující předpis ze str. 123<ref name="abop" /> a jedná se o velmi jednoduchý L-systém modelující [[růst]] [[list]]u rostliny. Čím vyšší iterace, tím vyspělejší list. Tento předpis má i své nevýhody, růst se nikdy nezastaví a pro iterace větší než 20 není použitelný. Pro ovlivnění rychlosti růstu a jeho zastavení by se dal použít složitější předpis.
Praktičtější ukázkou parametrických L-systémů je následující předpis ze str. 123<ref name="abop" /> a jedná se o velmi jednoduchý L-systém modelující [[růst]] [[list]]u rostliny. Čím vyšší iterace, tím vyspělejší list. Tento předpis má i své nevýhody, růst se nikdy nezastaví a pro iterace větší než 20 není použitelný. Pro ovlivnění rychlosti růstu a jeho zastavení by se dal použít složitější předpis.
Řádek 440: Řádek 444:
''K'' je konstanta představující délku kroku. Je použita jen kvůli tomu, aby stonek (tvořený symboly <tt>S</tt>) nebyl příliš dlouhý (roste 2× pomaleji než list), může se zvolit např. 1. Na obrázku níže je 5. až 21. iterace L-systému listu.
''K'' je konstanta představující délku kroku. Je použita jen kvůli tomu, aby stonek (tvořený symboly <tt>S</tt>) nebyl příliš dlouhý (roste 2× pomaleji než list), může se zvolit např. 1. Na obrázku níže je 5. až 21. iterace L-systému listu.


[[image:L-system-Leaf-grow.svg|500px|5. až 21. iterace L-systému modelující růst listu]]
[[Soubor:L-system-Leaf-grow.svg|500px|5. až 21. iterace L-systému modelující růst listu]]


=== Podmíněná přepisovací pravidla ===
=== Podmíněná přepisovací pravidla ===
Parametry symbolů se také dají použít k podmínění přepsání symbolu. K tomu slouží '''podmíněná přepisovací pravidla'''. Podmíněné přepisovací pravidlo je rozšířené běžné přepisovací pravidlo o podmínku. Přepisování pak probíhá tak, že se uvedená podmínka vyhodnotí, a když je pravdivá, přepisovací pravidlo se použije. Pokud pravdivá není, hledá se další vhodné přepisovací pravidlo. Pořadí ověřování přepisovacích pravidel musí být dáno (aby se zachoval determinismus), např. od dříve uvedených pravidel k později uvedeným. Pokud symbol není přepsán žádným přepisovacím pravidlem, platí pro něj [[Identita (matematika)|identita]] jako výchozí přepisovací pravidlo (je tedy zkopírován do další iterace).
Parametry symbolů se také dají použít k podmínění přepsání symbolu. K tomu slouží '''podmíněná přepisovací pravidla'''. Podmíněné přepisovací pravidlo je rozšířené běžné přepisovací pravidlo o podmínku. Přepisování pak probíhá tak, že se uvedená podmínka vyhodnotí, a když je pravdivá, přepisovací pravidlo se použije. Pokud pravdivá není, hledá se další vhodné přepisovací pravidlo. Pořadí ověřování přepisovacích pravidel musí být dáno (aby se zachoval determinismus), např. od dříve uvedených pravidel k později uvedeným. Pokud symbol není přepsán žádným přepisovacím pravidlem, platí pro něj [[Identita (matematika)|identita]] jako výchozí přepisovací pravidlo (je tedy zkopírován do další iterace).


[[image:RoseLeaf-Lsystem.svg|thumb|200px|25. iterace L-systému modelující list růže]]
[[Soubor:RoseLeaf-Lsystem.svg|náhled|200px|25. iterace L-systému modelující list růže]]
Ukázkou podmíněného přepisování je list [[růže]] ze str. 126.<ref name="abop" />
Ukázkou podmíněného přepisování je list [[růže]] ze str. 126.<ref name="abop" />


Řádek 455: Řádek 459:
| rrp1 = x(t,d) | rrr1 = . g(5, 1.15, -1) . [-y(t) g(3, 1.19, t) .}] [-y(t) {.] x(t+1, d) | rrc1 = d = 1
| rrp1 = x(t,d) | rrr1 = . g(5, 1.15, -1) . [-y(t) g(3, 1.19, t) .}] [-y(t) {.] x(t+1, d) | rrc1 = d = 1
| rrp2 = y(t) | rrr2 = g(1.3, 1.25, -1) y(t-1) | rrc2 = t > 0
| rrp2 = y(t) | rrr2 = g(1.3, 1.25, -1) y(t-1) | rrc2 = t > 0
| rrp3 = g(s,r,t) | rrr3 = g(s*r, r, t - 1) | rrc3 = t > 1
| rrp3 = g(s,r,t) | rrr3 = g(s*r, r, t 1) | rrc3 = t > 1
| rrp4 = g(s,r,t) | rrr4 = g(s*r, r, -1) | rrc4 = t = -1
| rrp4 = g(s,r,t) | rrr4 = g(s*r, r, -1) | rrc4 = t = -1
| uhel = 60
| uhel = 60
Řádek 478: Řádek 482:
Výsledek vykreslení bude díky stochastismu pokaždé trochu jiný, na následujícím obrázku je 9 interpretací 6. generace, uprostřed je L-systém bez randomizace.
Výsledek vykreslení bude díky stochastismu pokaždé trochu jiný, na následujícím obrázku je 9 interpretací 6. generace, uprostřed je L-systém bez randomizace.


[[image:RandomizedPythagorasLsystem.svg|500px|9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)]]
[[Soubor:RandomizedPythagorasLsystem.svg|500px|9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)]]


=== Náhodný výběr přepisovacího pravidla ===
=== Náhodný výběr přepisovacího pravidla ===
Řádek 498: Řádek 502:
8 různých výsledků je na obrázku níže (9. uprostřed bez stochastismu).
8 různých výsledků je na obrázku níže (9. uprostřed bez stochastismu).


[[image:PythagorasStochasticLsystem.svg|500px|9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)]]
[[Soubor:PythagorasStochasticLsystem.svg|500px|9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)]]


== Kontextové L-systémy ==
== Kontextové L-systémy ==
Řádek 508: Řádek 512:
| spoluautoři = a kol.
| spoluautoři = a kol.
| počet stran = 32
| počet stran = 32
| strany = 21-22
| strany = 21–22
| vydavatel = CSIRO Publishing
| vydavatel = CSIRO Publishing
| místo = Calgary, Alberta, Canada
| místo = Calgary, Alberta, Canada
Řádek 567: Řádek 571:


=== Plugin pro Blender ===
=== Plugin pro Blender ===
[[Blender]] je [[Otevřený software|open-source]] program pro modelování a vykreslování [[3D]] [[počítačová grafika|počítačové grafiky]], do kterého se dá stáhnout [[plugin]]<ref>Domácí stránka pluginu pro generování L-systémů v Blenderu: [http://lsystem.liquidweb.co.nz/]</ref>, který generuje rostliny pomocí L-systémů. Odlišností tohoto pluginu od ostatních programů je ta, že grafik nezadává předpis L-systému, ale pouze vizuálně nastavuje parametry výsledného modelu rostliny.
[[Blender]] je [[Otevřený software|open-source]] program pro modelování a vykreslování [[3D]] [[počítačová grafika|počítačové grafiky]], do kterého se dá stáhnout [[plugin]]<ref>Domácí stránka pluginu pro generování L-systémů v Blenderu: [http://lsystem.liquidweb.co.nz/] {{Wayback|url=http://lsystem.liquidweb.co.nz/ |date=20110415080335 }}</ref>, který generuje rostliny pomocí L-systémů. Odlišností tohoto pluginu od ostatních programů je ta, že grafik nezadává předpis L-systému, ale pouze vizuálně nastavuje parametry výsledného modelu rostliny.


<!--
<!--
== Implementace ==
== Implementace ==
Následující [[Zdrojový kód|kód]] je jednoduchá [[implementace]] paralelního přepisování L-systému. Zajímavé na něm je to, že nemá 2 fáze, jak bylo popsáno v úvodu k interpretaci, ale prochází L-systém &bdquo;do hloubky&ldquo;. Symboly si ukládá na [[Zásobník (datová struktura)|zásobník]] a přepisuje tak dlouho symbol na vrcholu zásobníku, dokud není v dostatečné generaci (nebo už nelze přepsat). Pak jej interpretuje (uloží do výstupního řetězce). Je proto schopen vygenerovat i obrovské výstupy (kdyby se výstup neukládal do paměti, ale např. rovnou vykresloval do bitmapy). Ukázka je v [[Programovací jazyk|jazyce]] [[C Sharp|C#]].
Následující [[Zdrojový kód|kód]] je jednoduchá [[implementace]] paralelního přepisování L-systému. Zajímavé na něm je to, že nemá 2 fáze, jak bylo popsáno v úvodu k interpretaci, ale prochází L-systém „do hloubky“. Symboly si ukládá na [[Zásobník (datová struktura)|zásobník]] a přepisuje tak dlouho symbol na vrcholu zásobníku, dokud není v dostatečné generaci (nebo už nelze přepsat). Pak jej interpretuje (uloží do výstupního řetězce). Je proto schopen vygenerovat i obrovské výstupy (kdyby se výstup neukládal do paměti, ale např. rovnou vykresloval do bitmapy). Ukázka je v [[Programovací jazyk|jazyce]] [[C Sharp|C#]].


<source lang="csharp">
<syntaxhighlight lang="csharp">
static string rewrite(string axiom, Dictionary<char, string> rewriteRules, int iterations) {
static string rewrite(string axiom, Dictionary<char, string> rewriteRules, int iterations) {
const char genEnd = '\x00'; // speciální znak pro detekci konce generace v zásobníku
const char genEnd = '\x00'; // speciální znak pro detekci konce generace v zásobníku
Řádek 610: Řádek 614:
return result.ToString();
return result.ToString();
}
}
</syntaxhighlight>
</source>
-->
-->


== Reference ==
== Reference ==
<references/>
<references />


== Související články ==
== Související články ==
Řádek 622: Řádek 626:


== Externí odkazy ==
== Externí odkazy ==
{{Commonscat|L-Systems|L-systém}}
* {{Commonscat}}
* Seriál o L-systémech na serveru root.cz: [http://www.root.cz/clanky/l-systemy-prirodni-objekty-i-umele-artefakty/ L-systémy: přírodní objekty i umělé artefakty]
* Seriál o L-systémech na serveru root.cz: [http://www.root.cz/clanky/l-systemy-prirodni-objekty-i-umele-artefakty/ L-systémy: přírodní objekty i umělé artefakty]
* Část diplomové práce Pavla Tišnovského: [http://www.fit.vutbr.cz/~tisnovpa/publikace/diplomka/doc/node20.html L-systémy]
* Část diplomové práce Pavla Tišnovského: [http://www.fit.vutbr.cz/~tisnovpa/publikace/diplomka/doc/node20.html L-systémy]
* {{en}} [http://algorithmicbotany.org/papers/ Algorithmic botany] – stránka [[Univerzita Calgary|Univerzity Calgary]] kde [[Przemyslaw Prusinkiewicz|Dr. Przemyslaw Prusinkiewicz]] spolu s jeho studenty a kolegy publikuje své práce
* {{en}} [http://algorithmicbotany.org/papers/ Algorithmic botany] – stránka [[Univerzita Calgary|Univerzity Calgary]] kde [[Przemyslaw Prusinkiewicz|Dr. Przemyslaw Prusinkiewicz]] spolu s jeho studenty a kolegy publikuje své práce
{{Autoritní data}}


[[Kategorie:Formální jazyky]]
[[Kategorie:Formální jazyky]]

Aktuální verze z 19. 7. 2021, 13:08

Traviny vymodelované pomocí L-systémů ve 3D

L-systém nebo také Lindenmayerův systém je varianta formální gramatiky, vyvinutá pro modelování růstu rostlin. L-systém popisuje pravidla pro vývoj rostliny, která se opakovaně aplikují na vznikající model. Tato pravidla mohou např. popisovat, za jakých podmínek se stonek rostliny rozdvojí, zda má vzniknout list nebo zda má část rostliny uhynout. Výsledný model se může např. vykreslit jako obrázek nebo se z něj vytvoří počítačový 3D model rostliny. L-systémy se také dají použít pro generování různých křivek, fraktálů nebo pro modelování buněčných organismů. [1]

Historie[editovat | editovat zdroj]

L-systémy byly vyvinuty v roce 1968 maďarským biologem Aristidem Lindenmayerem jako matematický formalizmus pro popisování růstu řas. [2] Symboly představovaly jednotlivé buňky a přepisovací pravidla L-systému simulovaly jejich dělení. Později polský informatik Przemyslaw Prusinkiewicz interpretoval symboly L-systémů pomocí želví grafiky (tedy symboly představovaly grafické elementy jako např. úsečky). Touto metodou se již dalo modelovat širší spektrum rostlin a různé fraktálové křivky. [3] Lindenmayer spolu s Prusinkiewiczem publikovali knihu The Algorithmic Beauty of Plants[4], která se dnes dá považovat za bibli L-systémů.

Postupem času se L-systémy začaly používat i pro další věci než je modelování rostlin a fraktálů. Například jde pomocí nich modelovat tok řek ve fraktálových horách[5], ulice ve virtuálních městech[6] nebo pomocí L-systémů lze popisovat podrozdělování (zjemňování) křivek[7]. Nicméně L-systémy mohou být použity i v jiných oborech než je počítačová grafika, například lze pomocí nich generovat hudbu[8][9].

Ve filmu Avatar z roku 2009 bylo přes 2000 stromů, rostlin a kapradin vymodelováno právě pomocí L-systémů.[10]

Definice L-systému[editovat | editovat zdroj]

Základní typ L-systému je tzv. D0L-systém. D0 v názvu značí, že se jedná o deterministický bezkontextový L-systém. Formálně je to trojice [4], kde

  • je abeceda, tj. neprázdná množina symbolů, je množina všech slov nad abecedou , je množina všech neprázdných slov nad abecedou ,
  • je semínko (z angl. seed) nebo také axiom, což je konečné slovo z abecedy , které definuje počáteční stav L-systému,
  • je konečná množina přepisovacích pravidel,
    • přepisovací pravidlo se zapisuje ve tvaru , kde a , definuje tedy přepsání symbolu na slovo (které může být i prázdné),
    • pro symbol , který se neobjevuje na levé straně žádného přepisovacího pravidla, je definována identita () (takové symboly jsou často označovány jako konstanty).

D0L-systém je velice podobný deterministické bezkontextové gramatice. Liší se například v tom, že gramatika rozlišuje terminální a neterminální symboly, ale L-systém pro neterminály definuje identitu jako výchozí přepisovací pravidlo. Další rozdíl je v tom, že gramatika má jako semínko jeden neterminální symbol, ale L-systém povoluje neprázdné slovo (libovolný konečný řetězec symbolů).

Každý symbol z abecedy je obvykle reprezentován jedním znakem (písmenem), což značně ulehčuje a zrychluje zápis. Avšak existují i speciální symboly, které jsou zapsány více znaky. Jsou to většinou velmi specifické symboly pro interpretaci. Aby se rozlišily vícepísmenné symboly, dává se před ně nějaký speciální prefix, např. zavináč. Ten pak není součástí abecedy. [11]

Iterativní vývoj L-systému[editovat | editovat zdroj]

L-systém se vytváří po iteracích, někdy zvaných též generace. N-tá generace je definována rekurzivními pravidly:

  • nultá iterace je samotný axiom
  • n-tá iterace (pro ) vznikne paralelní aplikací přepisovacích pravidel na výsledek iterace

Paralelní aplikace je nahrazení všech symbolů „najednou“. Paralelní přepsání se dá provést i sériově, a sice tak, že se postupně přepisují symboly zleva doprava, ale výsledek se ukládá na jiné místo (nevkládá se jako náhrada přepisovaného symbolu). Tak se docílí toho, že symboly vzniklé přepsáním se nepřepíší podruhé.

Příklad 1: růst řas[editovat | editovat zdroj]

Následující příklad je Lindenmayerův původní L-systém pro modelování růstu řas (konkrétně Anabaena catenula). Tato řasa má dva typy buněk, které tvoří řetízky. Každý typ se vyznačuje odlišným chováním, které probíhá ve fázích. Následující L-systém zachycuje právě toto chování.

gramatika
abeceda: A B
axiom: A
přepis. pravidla: AAB
BA

Jednotlivé iterace vypadají následovně:

i = 0 : A
i = 1 : AB
i = 2 : ABA
i = 3 : ABAAB
i = 4 : ABAABABA
i = 5 : ABAABABAABAAB
i = 6 : ABAABABAABAABABAABABA
i = 7 : ABAABABAABAABABAABABAABAABABAABAAB

Procentuální zastoupení A : B inklinuje k poměru 61,8034 : 38,1966 %.

Příklad 2: Fibonacciho posloupnost[editovat | editovat zdroj]

Mějme následující gramatiku:

gramatika
abeceda: A B
axiom: A
přepis. pravidla: AB
BAB

Oproti 1. příkladu se liší pouze v prohození vzorů přepisovacích pravidel, nicméně výsledek bude odlišný.

i = 0 : A
i = 1 : B
i = 2 : AB
i = 3 : BAB
i = 4 : ABBAB
i = 5 : BABABBAB
i = 6 : ABBABBABABBAB
i = 7 : BABABBABABBABBABABBAB

Zajímavé na tomto L-systému je to, že délka výsledného řetězce v i-té iteraci je rovna i-tému číslu ve Fibonacciho posloupnosti (pro a ):

1, 1, 2, 3, 5, 8, 13, 21, …

Výstupní řetězec má stejnou vlastnost, která platí pro Fibonacciho posloupnost, tj. i-té číslo () je součtem předchozích dvou. Tedy i-tá iterace tvořena spojením iterací a . Malou změnou druhého přepisovacího pravidla na (B → BA) bude výsledek splňovat stejné vlastnosti jako původní, jen se budou iterace spojovat „popořadě“, tedy i-tá iterace bude tvořena spojením iterací a . Z toho vyplývá i to, že délky jednotlivých iterací budou také odpovídat číslům ve Fibonacciho posloupnosti. Tato odlišnost ve Fibonacciho posloupnosti není, protože sčítání dvou čísel je komutativní.

Další zajímavou vlastností řetězců v příkladech 1 a 2 je úzká souvislost se zlatým řezem. Pro platí, že symbol na k-tém místě od neměnného konce („začátek“ u př. 1, „konec“ u př. 2) je buď A nebo B, podle toho, zda nějaký celočíselný násobek zlatého řezu padne (náleží) do otevřeného intervalu . Poměr počtu symbolů A a B tedy pro konverguje k hodnotě zlatého řezu

V následující tabulce je tato vlastnost konkrétně ukázána na L-systému Fibonacciho posloupnosti.

k k-tý symbol interval nás. zl. řezu matematický důvod
1 B (1, 2) 1
2 A (2, 3) neexistuje a
3 B (3, 4) 2
4 B (4, 5) 3
5 A (5, 6) neexistuje a
6 B (6, 7) 4

Interpretace symbolů[editovat | editovat zdroj]

Jednotlivé symboly L-systému se mohou interpretovat jakkoli. U některých L-systémů je podstatný pouze počet symbolů v i-té iteraci, u jiných se symboly chápou jako příkazy pro kreslení nebo dokonce mohou reprezentovat základní části rostliny (např. jako 3D modely), ze kterých se „poskládá“ výsledný model.

Vykreslování ve 2D[editovat | editovat zdroj]

Představa, jak želva něco kreslí (želví grafika)

Obvyklá (a jedna z nejjednodušších) je interpretace pomocí želví grafiky. Tato interpretace chápe symboly jako příkazy pro štětec (želvu nesoucí štětec), který podle nich kreslí úsečky a vyplněné polygony v rovině. Interpretace probíhá dvoufázově, nejprve se L-systém vygeneruje (vyiteruje) do požadované iterace a poté se výsledek interpretuje (kreslí). Pro první fázi musí být zadán počet iterací a pro druhou výchozí stav štětce (želvy). Ten v nejjednodušší variantě obsahuje délku kroku a úhel otočení štětce, ale může obsahovat i různé další údaje, jako např. barvu nebo šířku štětce. Během druhé fáze interpretace je také udržován stav štětce v rovině, tedy v jakém místě se nachází a jak je orientován. V následující tabulce je shrnuta obvyklá interpretace symbolů ve druhé fázi. Tyto příkazy dávají rozkazy štětci (želvě).

Symboly Interpretace
A-U, 0-9 „Nakresli úsečku.“, úsečka je nakreslena ve směru orientace štětce (délka úsečky je délka kroku)
a-u „Pohni se vpřed (bez kreslení).“ (délka pohybu je délka kroku)
V-Z, v-z „Nedělej nic.“, obvykle se jedná o písmena ke konci abecedy, hranice není ustálena (používá se pro potřeby vývoje L-systému)
+, - „Otoč se doleva (resp. doprava) o předem stanovený úhel.“ (o úhel otočení)
| „Otoč se čelem vzad.“ (rotace o 180°)
[ „Zapamatuj si aktuální stav.“, přesněji řečeno „Ulož aktuální stav na zásobník.“ (stavem se myslí aktuální poloha a orientace v rovině)
] „Přesuň se na naposledy zapamatovaný stav.“, přesněji řečeno „Přesuň se na pozici, kterou určuje stav na vrcholu zásobníku a ten z vrcholu odstraň“
{ „Ulož rozpracovaný polygon na zásobník a začni zaznamenávání bodů nového polygonu.“
. „Přidej bod, na kterém stojíš do aktuálního polygonu.“
} „Vykresli rozpracovaný polygon a načti polygon z vrcholu zásobníku jako aktuální polygon (pokud tam nějaký je).“

Pokud nebude uvedeno jinak, tato interpretace je použita u všech ukázek v tomto článku.

Vykreslování ve 3D[editovat | editovat zdroj]

Výše uvedená 2D interpretace se dá jednoduše rozšířit do 3D. Štětec se bude pohybovat v prostoru místo v rovině. Stav bude podobný, tedy bude to poloha a orientace v prostoru. Pro pohyb v trojrozměrném prostoru je třeba více příkazů pro otočení, protože se dá otáčet podle 3 os (ve 2D je pouze 1 osa). V následující tabulce je seznam interpretací symbolů, které je potřeba přidat.

Graficky znázorněné otáčení ve 3D
Symboly Interpretace
+, - „otoč se doleva (resp. doprava) o předem stanovený úhel“ (stejné jako ve 2D), pokud si představíte štětec jako letadlo a směr štětce jako směr letu letadla, pak tyto symboly představují zahýbání letadla doleva a doprava, z pohledu pilota (angl. yaw viz obr.)
^, & „otoč se nahoru (resp. dolů) o předem stanovený úhel“, u letadla by to znamenalo stoupání a klesání (angl. pitch viz obr.)
/, \ „otoč se doleva (resp. doprava) podle osy určené mým směrem o předem stanovený úhel“, u letadla by tyto příkazy vypadaly jako „výkrut“, otáčení podél osy letu (angl. roll viz obr.)

Příklady L-systémů[editovat | editovat zdroj]

Kochova vločka[editovat | editovat zdroj]

Animace interpretace L-systému želví grafikou

Následující předpis vygeneruje část Kochovy vločky.

gramatika
abeceda: F + -
axiom: F
přepis. pravidla: FF+F--F+F
interpretace
úhel otočení: 60°

pozn.: výchozí poloha štětce (želvy) je vlevo dole a štětec je orientován vpravo

i = 0: F
0. generace (axiom) Kochovy vločky
i = 1: F+F--F+F
1. generace Kochovy vločky
i = 2: F+F--F+F + F+F--F+F-- F+F--F+F + F+F--F+F
2. generace Kochovy vločky
i = 3: F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F + F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F -- F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F + F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F
3. generace Kochovy vločky

Stromeček[editovat | editovat zdroj]

L-systémy byly vytvořeny pro modelování růstu rostlin. Vymodelovat jednoduchý stromeček je proto velmi jednoduché.

gramatika
abeceda: M S + - [ ]
axiom: M
přepis. pravidla: MS[+M][-M]SM
SSS
interpretace
úhel otočení: 45°

Přepisovací pravidla by se dala popsat slovy takto:

  • symbol M představuje mladou část rostliny (na obr. zeleně), symbol S starou část (hnědě)
  • první přepisovací pravidlo říká, že každá mladá část M se přepíše (nahradí) za starou část S, pak dvě mladé větvičky vlevo ([+M]) a vpravo ([-M]), dále starou část S a nakonec mladou část M
  • druhé říká pouze to, že každá stará část S se přepíše na dvě staré části SS, jinými slovy, délka starých částí se mezi iteracemi zdvojnásobí

Na následujícím obrázku můžete vidět prvních 6 iterací i s grafickým znázorněním přepisovacích pravidel.

Prvních 6 iterací fraktálu stromečku

Ostrovy a jezera[editovat | editovat zdroj]

Graficky znázorněné přepisovací pravidlo L-systému Ostrovy a jezera

Další fraktál generovaný pomocí L-systémů se jmenuje „Ostrovy a jezera“ (z angl. „Islands and lakes“). Jeho předpis můžete také nalézt v knize The Algorithmic Beauty of Plants na str. 9.[4]

gramatika
abeceda: F f + -
axiom: F+F+F+F
přepis. pravidla: FF+f-FF+F+FF+Ff+FF-f+FF-F-FF-Ff-FFF
fffffff
interpretace
úhel otočení: 90°

Výše uvedený předpis pro jednoduchost kreslí pouze hranice ostrovů a jezer. Avšak pro lepší představu byl následující obrázek vygenerován rozšířeným předpisem o příkazy, které generují polygony.

3. iterace L-systému Ostrovy a jezera

Penroseovo dláždění[editovat | editovat zdroj]

Pomocí složitějšího L-systému se dá generovat Penroseovo dláždění.

{{L-systém | abeceda = M N O P + - [ ] { . } | axiom = [N]++[N]++[N]++[N]++[N] | rrp0 = M | rrr0 = O++{.P.----N.[-O.----M.}]++ | rrp1 = N | rrr1 = +{.O.--P.[---M.--N.}]+ | rrp2 = O | rrr2 = -{.M.++N.[+++O.++P.}]- | rrp3 = P | rrr3 = --{.O.++++M.[+P.++++N.}]--N | uhel = 36 }} pozn.: vykreslování úseček proběhne až po vykreslení všech polygonů (aby je polygony nepřekryly)

Gosperova křivka[editovat | editovat zdroj]

Vizualizace přepisovacího pravidla Gosperovy křivky

Následující křivka, která je pojmenovaná po americkém matematikovi a programátorovi jménem Bill Gosper, splňuje definici plochu-vyplňující křivky a také FASS křivky.

gramatika
abeceda: L R + -
axiom: L
přepis. pravidla: LL+R++R-L--LL-R+
R-L+RR++R+L--L-R
interpretace
úhel otočení: 60°

Na následujícím obrázku je 5. iterace Gosperovy křivky plynule obarvena celým barevným spektrem od červené až po fialovou. Díky tomu lze vidět, kudy a jak křivka vede.

5. iterace Gosperovy křivky obarvená celým barevným spektrem od červené po fialovou a zpět k červené pro lepší pozorování jejího vývoje

Parametrické L-systémy[editovat | editovat zdroj]

Parametrický L-systém (PL-systém) je rozšíření základního L-systému o parametry symbolu. Ke každému symbolu může být asociován libovolný konečný počet parametrů. Parametr je obvykle reálné číslo, se kterým se dají dělat běžné matematické operace. Jako parametr může být dosazen i aritmetický výraz, funkce nebo proměnná. Hodnota takového parametru se vyčíslí jako reálné číslo vždy, když je třeba.

Pro zápis parametrů se používá závorková syntaxe. Hodnoty parametru se za symbol píší do kulatých závorek. Tyto závorky, ani žádné symboly v nich, se nepovažují jako symboly L-systému. Jednotlivé parametry uvnitř závorek se oddělují čárkou. V následující tabulce je uvedeno několik příkladů zápisu.

Syntaxe Popis
F(1) symbol F s parametrem 1
F(0, 1, √2) symbol F s parametry 0, 1 a √2
F(, 1) symbol F s 1. parametrem nezadaným a 2. parametrem 1
F(x) symbol F, který má jako 1. parametr proměnnou x

Zápis přepisovacího pravidla parametrického L-systému vypadá např. takto:

A(t) → B(t/2) C(5) D E(1/t, 8).

Slovní popis: „Symbol A s parametrem t (jehož hodnota se vyčíslí jako reálné číslo) se přepíše na symbol B s parametrem , symbol C s parametrem , symbol D bez parametru a symbol E s parametry a 8.“

Interpretace[editovat | editovat zdroj]

Parametry symbolů slouží zejména pro snadné předávání číselných hodnot pro interpretaci a pro řízení vývoje L-systému. Při interpretaci symbolů želví grafikou, která se používá v tomto článku, se 1. parametr symbolů chápe následovně:

Symboly Interpretace, kde 1. parametr má hodnotu X
A-U,0-9 „nakresli úsečku ve směru natočení o délce X
a-u „pohni se ve směru natočení bez kreslení o X
+, - „otoč se doleva (resp. doprava) o X

Pokud u výše uvedených symbolů není 1. parametr zadán, použije se výchozí hodnota (jako u D0L-systémů), pokud nejsou zadány ostatní parametry, mají nedefinovanou hodnotu (např. NaN). Příklady:

Zápis Interpretace
F(1, 2) „nakresli úsečku ve směru natočení o délce 1“
+(80) „otoč se doleva (resp. doprava) o 80°“
F resp. F() „nakresli úsečku ve směru natočení o výchozí délce“
+(,0) „otoč se doleva (resp. doprava) o výchozí úhel zadaný L-systémem“

Příklady[editovat | editovat zdroj]

10. iterace H-stromu s parametry R = 1/√2 a U = 90

Jako jednoduchý příklad parametrického L-systému poslouží fraktál jménem H-strom. Říká se mu tak proto, že pro vhodně zvolené hodnoty proměnných vypadá jako písmena H tvořená z písmen H, tvořená z písmen H

H-strom (L-systém)
gramatika
abeceda: F H + - [ ]
axiom: F(200)
přepis. pravidla: F(l)H(l) [+F(l * R)] [-F(l * R)]
interpretace
úhel otočení: U°

R a U jsou proměnné L-systému (nejsou to symboly abecedy, ani nemají nic společného s parametrickými L-systémy). Pro jejich různé hodnoty bude výsledek vypadat odlišně. Obvyklými hodnotami jsou R = 1/√2 a U = 90. Zajímavé je, že s těmito hodnotami tvoří H-strom plochu-vyplňující L-systém (a je dokonce v kategorii FASS). Mírně odlišný výsledek vznikne s hodnotami R = 0,69 a U = 85, na následujícím obrázku je jeho 10. iterace. Pro hodnoty proměnných R = 1/√2 a U = 45 vznikne Pythagorův strom.

H-strom s parametry R = 0,99 a U = 85

Praktičtější ukázkou parametrických L-systémů je následující předpis ze str. 123[4] a jedná se o velmi jednoduchý L-systém modelující růst listu rostliny. Čím vyšší iterace, tím vyspělejší list. Tento předpis má i své nevýhody, růst se nikdy nezastaví a pro iterace větší než 20 není použitelný. Pro ovlivnění rychlosti růstu a jeho zastavení by se dal použít složitější předpis.

List rostliny (L-systém)
gramatika
abeceda: F S x y z [ ] { . }
axiom: [|S(K/2)] [x] [y]
přepis. pravidla: x[+x{.].z.}
y[-y{.].z.}
zzF(K)
S(len)F(len) +(1) S(len)
interpretace
úhel otočení: 10°

pozn.: symboly x, y, z nedělají nic, symboly F, S kreslí úsečku, viz interpretace symbolů

K je konstanta představující délku kroku. Je použita jen kvůli tomu, aby stonek (tvořený symboly S) nebyl příliš dlouhý (roste 2× pomaleji než list), může se zvolit např. 1. Na obrázku níže je 5. až 21. iterace L-systému listu.

5. až 21. iterace L-systému modelující růst listu

Podmíněná přepisovací pravidla[editovat | editovat zdroj]

Parametry symbolů se také dají použít k podmínění přepsání symbolu. K tomu slouží podmíněná přepisovací pravidla. Podmíněné přepisovací pravidlo je rozšířené běžné přepisovací pravidlo o podmínku. Přepisování pak probíhá tak, že se uvedená podmínka vyhodnotí, a když je pravdivá, přepisovací pravidlo se použije. Pokud pravdivá není, hledá se další vhodné přepisovací pravidlo. Pořadí ověřování přepisovacích pravidel musí být dáno (aby se zachoval determinismus), např. od dříve uvedených pravidel k později uvedeným. Pokud symbol není přepsán žádným přepisovacím pravidlem, platí pro něj identita jako výchozí přepisovací pravidlo (je tedy zkopírován do další iterace).

25. iterace L-systému modelující list růže

Ukázkou podmíněného přepisování je list růže ze str. 126.[4]

List růže (L-systém)
gramatika
abeceda: g x y [ ] { . }
axiom: [{x(0,0).}] [{x(0,1).}
přepis. pravidla: x(t,d). g(5, 1.15, -1) . [+y(t) g(3, 1.19, t) .}] [+y(t) {.] x(t+1, d)

pokud d = 0

x(t,d). g(5, 1.15, -1) . [-y(t) g(3, 1.19, t) .}] [-y(t) {.] x(t+1, d) pokud d = 1
y(t)g(1.3, 1.25, -1) y(t-1) pokud t > 0
g(s,r,t)g(s*r, r, t – 1) pokud t > 1
g(s,r,t)g(s*r, r, -1) pokud t = -1
interpretace
úhel otočení: 60°

Stochastické L-systémy[editovat | editovat zdroj]

Deterministické L-systémy se vyznačují tím, že je jednoznačně definováno, jak vypadá n-tá iterace a při opakovaném výpočtu je vždy stejná. Při modelování rostlin je však žádoucí, aby se na modelu promítl nějaký prvek náhody (stochastismu). Proto se používají stochastické L-systémy (0L-systémy), které v sobě mají určitý prvek náhody, díky kterému je výsledek vždy trochu jiný. Pak se dá pomocí jednoho stochastického L-systému modelující např. strom vymodelovat celý les, který vypadá přirozeně, protože každý strom je trochu jiný.

Randomizace při interpretaci[editovat | editovat zdroj]

Nejjednoduššího stochastismu se dosáhne randomizací („znáhodnění“) změny úhlu otočení a délky kroku. Kvůli tomu není nutné zasahovat do přepisovacího systému, ten zůstane nezměněn. Změna se projeví až při interpretaci symbolů. Jako příklad je uveden Pythagorův strom s randomizací úhlu a délky kroku o ±30%.

Randomizovaný Pythagorův strom 1 (L-systém)
gramatika
abeceda: F L + -
axiom: F(50)
přepis. pravidla: F(t)L(t) [+F(t / √2)] -F(t / √2)
interpretace
úhel otočení: 45°
randomiz. úhlu: 30%
randomiz. kroku: 30%

Výsledek vykreslení bude díky stochastismu pokaždé trochu jiný, na následujícím obrázku je 9 interpretací 6. generace, uprostřed je L-systém bez randomizace.

9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)

Náhodný výběr přepisovacího pravidla[editovat | editovat zdroj]

Pokročilejšího stochastismu se u L-systémů dosahuje náhodným výběrem mezi více přepisovacími pravidly. Každé takové pravidlo má určitou váhu, která určuje, s jakou pravděpodobností se vybere. Tato váha je uvedena u každého pravidla, které je náhodné. Pravděpodobnost vybrání konkrétního pravidla je určena hodnotou váhy onoho pravidla vydělené součtem vah všech pravidel, které připadají v úvahu pro přepsání konkrétního symbolu. Pokud váhy nejsou uvedeny, ale jedná se o stochastický L-systém, všechna pravidla mají váhu (a pravděpodobnost vybrání) stejnou.

Randomizovaný Pythagorův strom 2 (L-systém)
gramatika
abeceda: F L + -
axiom: F(50)
přepis. pravidla: F(t) L(t) [+F(t / √2)] -F(t / √2)
F(t) L(t) +F(t / √2)
F(t) L(t) -F(t / √2)
interpretace
úhel otočení: 45°
randomiz. úhlu: 30%
randomiz. kroku: 30%

pozn.: pravděpodobnostní váhy jsou uvedeny nad šipkami u přepisovacích pravidel

8 různých výsledků je na obrázku níže (9. uprostřed bez stochastismu).

9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)

Kontextové L-systémy[editovat | editovat zdroj]

Kontextové L-systémy mohou obsahovat přepisovací pravidla, která specifikují, jaký musí být kontext přepisovaného symbolu, aby se pravidlo použilo. Kontextem se myslí symboly před a za přepisovaným symbolem. Tím se napodobuje mechanismus, kterým rostliny řídí svůj vývoj. Ty si dokáží vyměňovat informace mezi sousedícími buňkami ve formě živin nebo hormonů[4]. Kontextovým mechanismem se také dá simulovat napadení rostliny parazitem. [12]

Kontextový L-systém je velice blízký kontextové gramatice, tedy každý přepisovaný symbol má levý a pravý kontext, který je pro přepsání nutný. kontextové přepisovací pravidlo má následující zápis:

lc < S > pcnahrada, kde
  • lc je levý kontext, tedy výčet symbolů, které musí být bezprostředně vlevo od přepisovaného symbolu S,
  • S je přepisovaný symbol,
  • pc je pravý kontext, tedy výčet symbolů, které musí být bezprostředně vpravo od přepisovaného symbolu S,
  • nahrada jsou symboly, za které se S přepíše.

1L-systémy[editovat | editovat zdroj]

Označení 1L-systém se používá pro kontextový L-systém, který má kontextová přepisovací pravidla buď s levým nebo s pravým kontextem (nikoli s oběma najednou). Tyto L-systémy mohou obsahovat i bezkontextová pravidla. Při vyhodnocování mají však přednost kontextová.

gramatika
abeceda: a A
axiom: Aaaaaa
přepis. pravidla: A < aA
Aa

Výsledek bude po iteracích vypadat následovně:

i = 0 : Aaaaaa
i = 1 : aAaaaa
i = 2 : aaAaaa
i = 3 : aaaAaa
i = 4 : aaaaAa atd.

Této technice se říká propagace signálu a používá se pro modelování pokročilých modelů rostlin.[4]

2L-systémy[editovat | editovat zdroj]

2L-systémy obsahují i kontextová přepisovací pravidla, která mají oba kontexty. Krom nich mohou obsahovat vše co 1L-systémy.

L-systémy reagující na prostředí[editovat | editovat zdroj]

Základní L-systém se dá také rozšířit o speciální symboly, které se použijí pro obousměrnou komunikaci s prostředím. Prostředí je obvykle nějaká datová struktura, která je schopna odpovídat na dotazy typu „Jak moc je v tomto místě volno“ a dokáže přijímat příkazy typu „Na tomto místě je objekt velikosti x“. Pak se pomocí těchto L-systému dá vymodelovat rostlina, která se vyvíjí lépe tam, kde má více „místa“ nebo kde je výživnější půda. Pokud v přírodě rostou dva stromy blízko sebe, budou mít více větví na straně odvrácené od sousedního stromu a naopak málo větví bude směřovat do koruny sousedního. Toto chování se dá popsat právě pomocí L-systémů s prostředím. [13]

Aplikace generující L-systémy[editovat | editovat zdroj]

Fractint[editovat | editovat zdroj]

Fractint[14] je freeware generátor fraktálů pro DOS (Windows) a Linux. Program podporuje pouze základní typ L-systémů (tj. D0L-systémy). Výstup programu je možné uložit do souborů BMP a GIF

Inkscape[editovat | editovat zdroj]

Inkscape je open source vektorový grafický editor používající SVG jako svůj nativní formát. Obsahuje skript pro generování základního typu L-systémů (tj. D0L-systémů). Jeho výhoda je však ta, že výsledek je vektorový a dá se s ním v programu dále pracovat.

Plugin pro Blender[editovat | editovat zdroj]

Blender je open-source program pro modelování a vykreslování 3D počítačové grafiky, do kterého se dá stáhnout plugin[15], který generuje rostliny pomocí L-systémů. Odlišností tohoto pluginu od ostatních programů je ta, že grafik nezadává předpis L-systému, ale pouze vizuálně nastavuje parametry výsledného modelu rostliny.


Reference[editovat | editovat zdroj]

  1. BOEAR, Martin; FRACCHIA, David; PRUSINKIEWICZ, Przemyslaw. A model for cellular development in morphogenetic fields. [s.l.]: [s.n.] 20 s. Dostupné online. (anglicky) 
  2. LINDENMAYER, Aristid. Mathematical models for cellular interactions in development. Svazek Journal of theoretical biology Parts I and II. [s.l.]: Elsevier, 1968. S. 280–315. (anglicky) 
  3. PRUSINKIEWICZ, Przemyslaw. Graphical applications of L-systems. [s.l.]: Department of Computer Science, University of Regina (anglicky) 
  4. a b c d e f g LINDENMAYER, Aristid; PRUSINKIEWICZ, Przemyslaw, a kol. The Algorithmic Beauty of Plants. [s.l.]: Springer, c1991 228 s. Dostupné online. (anglicky) 
  5. PRUSINKIEWICZ, P.; HAMMEL, M. A fractal model of mountains and rivers. [s.l.]: Canadian Information Processing Society, c1993 S. 174–180. (anglicky) 
  6. PARISH, Y.I.H.; MÜLLER, P. Procedural modeling of cities. [s.l.]: [s.n.], c2001 Dostupné online. ISBN 1-58113-374-X. S. 301–308. (anglicky) 
  7. PRUSINKIEWICZ, Przemyslaw, a kol. L-system description of subdivision curves. Svazek International Journal of Shape Modeling. [s.l.]: [s.n.], c2003 S. 41–59. (anglicky) 
  8. HAZARD, C.; CATHERINE, K.; JOHNSON, D. Fractal Music [online]. [cit. 2012-03-01]. Dostupné v archivu pořízeném dne 2012-02-22. (anglicky) 
  9. MANOUSAKIS, S. Musical L-systems. [s.l.]: Nepublikovaná magisterská práce, Institute of Sonology, Hague, c2006 (anglicky) 
  10. Avatar a Run for the Artefact: Goliáš a David počítačové animace
  11. FUHRER, Martin. Hairs, Textures, and Shades: Improving the Realism of Plant Models Generated with L-Systems. [s.l.]: [s.n.], c2005 121 s. Dostupné online. (anglicky) 
  12. PRUSINKIEWICZ, Przemyslaw, a kol. L-systems: from the theory to visual models of plants. Calgary, Alberta, Canada: CSIRO Publishing 32 s. Dostupné online. S. 21–22. (anglicky) 
  13. MECH, Radomir; PRUSINKIEWICZ, Przemyslaw. Visual Models of Plants Interacting with Their Environment. [s.l.]: [s.n.] Dostupné online. (anglicky) 
  14. Domácí stránka freeware generátoru fraktálů Fractint: [1]
  15. Domácí stránka pluginu pro generování L-systémů v Blenderu: [2] Archivováno 15. 4. 2011 na Wayback Machine.

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]