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:
{{Dobrý článek}}
[[ImageSoubor:Fractal weeds.jpg|thumbná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ů]].
<ref>{{Citace monografie
Řádek 74:
| strany = 301–308
| 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
| titul = L-system description of subdivision curves
Řádek 94 ⟶ 96:
| datum přístupu = 2012-03-01
| 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
| vydavatel = Nepublikovaná magisterská práce, Institute of Sonology, Hague
Řádek 113 ⟶ 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]]).
 
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íneterminální symbol|neterminální]] symbolyy, 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.
<ref>{{Citace monografie
| titul = Hairs, Textures, and Shades: Improving the Realism of Plant Models Generated with L-Systems
Řádek 181 ⟶ 186:
: 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;„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;„začátek“ u př. 1, &bdquo;konec&ldquo;„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>
Řádek 210 ⟶ 215:
 
=== Vykreslování ve 2D ===
[[ImageSoubor:Kturtle side view.svg|thumbná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ě).
 
Řádek 221 ⟶ 226:
| <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>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í'')
Řádek 241 ⟶ 246:
 
=== 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.
 
[[imageSoubor:Roll, yaw, pitch.jpg|thumbnáhled|200px|Graficky znázorněné otáčení ve 3D]]
{| class="wikitable"
|-
! Symboly !! Interpretace
|-
| <tt>+</tt>, <tt>-</tt> || &bdquo;otoč„otoč se doleva (resp. doprava) o předem stanovený úhel&ldquo;ú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č„otoč se nahoru (resp. dolů) o předem stanovený úhel&ldquo;úhel“, u letadla by to znamenalo stoupání a klesání (angl. ''pitch'' viz obr.)
|-
| <tt>/</tt>, <tt>\</tt> || &bdquo;otoč„otoč se doleva (resp. doprava) podle osy určené mým směrem o předem stanovený úhel&ldquo;úhel“, u letadla by tyto příkazy vypadaly jako &bdquo;výkrut&ldquo;„výkrut“, otáčení podél osy letu (angl. ''roll'' viz obr.)
|}
 
== Příklady L-systémů ==
=== Kochova vločka ===
[[ImageSoubor:KochTurtleAnim.gif|thumbnáhled|Animace interpretace L-systému želví grafikou]]
Následující předpis vygeneruje část [[Kochova vločka|Kochovy vločky]].
 
Řádek 268 ⟶ 273:
''pozn.: výchozí poloha štětce (želvy) je vlevo dole a štětec je orientován vpravo''
 
:''i'' = 0: <tt>F</tt>
:[[ImageSoubor:KochCurve0.svg|0. generace (axiom) Kochovy vločky]]
 
:''i'' = 1: <tt>F+F--F+F</tt>
:[[ImageSoubor: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>
:[[ImageSoubor: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>
:[[ImageSoubor:KochCurve3.svg|3. generace Kochovy vločky]]
 
=== Stromeček ===
Řádek 298 ⟶ 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.
 
[[imageSoubor:LsystemTree.svg|Prvních 6 iterací fraktálu stromečku]]
 
=== Ostrovy a jezera ===
[[imageSoubor:IslandsAndLakesRewriteRule.svg|thumbná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„Ostrovy a jezera&ldquo;jezera“'' (z angl. '' &bdquo;Islands„Islands and lakes&ldquo;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
Řádek 314 ⟶ 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.
 
[[imageSoubor:IslandsAndLakesColored.svg|400px|3. iterace L-systému Ostrovy a jezera]]
 
=== Penroseovo dláždění ===
Řádek 324 ⟶ 329:
| rrp0 = M | rrr0 = O++{.P.----N.[-O.----M.}]++
| rrp1 = N | rrr1 = +{.O.--P.[---M.--N.}]+
| rrp2 = O | rrr2 = -<nowiki/>{.M.++N.[+++O.++P.}]-
| rrp3 = P | rrr3 = --{.O.++++M.[+P.++++N.}]--N
| uhel = 36
Řádek 339 ⟶ 344:
 
=== Gosperova křivka ===
[[imageSoubor:HexaGosperCurveRewriteRule.svg|thumbná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]].
 
Řádek 352 ⟶ 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.
 
[[imageSoubor: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 ==
Řádek 385 ⟶ 390:
! Symboly !! Interpretace, kde 1. parametr má hodnotu ''X''
|-
| <tt>A</tt>-<tt>U</tt>,<tt>0</tt>-<tt>9</tt> || &bdquo;nakresli„nakresli úsečku ve směru natočení o délce ''X''&ldquo;
|-
| <tt>a</tt>-<tt>u</tt> || &bdquo;pohni„pohni se ve směru natočení bez kreslení o ''X''&ldquo;
|-
| <tt>+</tt>, <tt>-</tt> || &bdquo;otoč„otoč se doleva (resp. doprava) o ''X''&ldquo;
|}
 
Řádek 398 ⟶ 403:
! Zápis !! Interpretace
|-
| <tt>F(1, 2)</tt> || &bdquo;nakresli„nakresli úsečku ve směru natočení o délce 1&ldquo;1“
|-
| <tt>+(80)</tt> || &bdquo;otoč„otoč se doleva (resp. doprava) o 80°&ldquo;
|-
| <tt>F</tt> resp. <tt>F()</tt> || &bdquo;nakresli„nakresli úsečku ve směru natočení o výchozí délce&ldquo;délce“
|-
| <tt>+(,0)</tt> || &bdquo;otoč„otoč se doleva (resp. doprava) o výchozí úhel zadaný L-systémem&ldquo;systémem“
|}
 
=== Příklady ===
[[imageSoubor:H-tree-rooted.svg|thumbná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''…
 
Řádek 419 ⟶ 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í 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]]
 
[[imageSoubor: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.
Řádek 440 ⟶ 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.
 
[[imageSoubor:L-system-Leaf-grow.svg|500px|5. až 21. iterace L-systému modelující růst listu]]
 
=== 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).
 
[[imageSoubor:RoseLeaf-Lsystem.svg|thumbná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" />
 
Řádek 455 ⟶ 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
| 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
| rrp4 = g(s,r,t) | rrr4 = g(s*r, r, -1) | rrc4 = t = -1
| uhel = 60
Řádek 478 ⟶ 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.
 
[[imageSoubor: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 ===
Řádek 498 ⟶ 502:
8 různých výsledků je na obrázku níže (9. uprostřed bez stochastismu).
 
[[imageSoubor:PythagorasStochasticLsystem.svg|500px|9 interpretací 6. generace stochastického L-systému (uprostřed bez randomizace)]]
 
== Kontextové L-systémy ==
Řádek 508 ⟶ 512:
| spoluautoři = a kol.
| počet stran = 32
| strany = 21-2221–22
| vydavatel = CSIRO Publishing
| místo = Calgary, Alberta, Canada
Řádek 567 ⟶ 571:
 
=== 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/] {{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 ==
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„do hloubky&ldquo;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#]].
 
<sourcesyntaxhighlight lang="csharp">
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
Řádek 610 ⟶ 614:
return result.ToString();
}
</syntaxhighlight>
</source>
-->
 
== Reference ==
<references />
 
== Související články ==
Řádek 622 ⟶ 626:
 
== Externí odkazy ==
* {{Commonscat|L-Systems|L-systém}}
* 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]
* {{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]]