Języki formalne i automaty Ćwiczenia 5 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 L-systemy... 2 Grafika żółwia... 2 Bibliografia... 5 Zadania... 6 Zadania na 3.0... 6 Zadania na 4.0... 6 Zadania na 5.0... 6
Wstęp teoretyczny L-systemy L-systemy to pewne rodzaje gramatyk. Aksjomat to łańcuch startowy od którego zaczynamy wszelkie wyprowadzenia. W zwykłej gramatyce każde wyprowadzenie zaczynało się od symbolu startowego. Wyprowadzenie słów w L-systemie jest odmienne. To znaczy zaczynając od aksjomatu, w każdym kroku stosujemy wszystkie możliwe produkcje począwszy od lewej. Przykład: G gggf Zaczynamy wyprowadzenie od aksjomatu G: G gggf ggggfgggff gg gggf gggf fg gggf gggf ff... Jeśli w każdym kroku dokładnie wiemy, którą produkcję zastosować to L-system jest nazywany deterministycznym. Jeśli w jakimś kroku istnieje więcej niż jedna możliwość zastosowania produkcji i dla każdej z nich przyporządkowane jest prawdpodobieństwo wyboru danej produkcji to l-system nazywany jest stochastycznym. Będziemy używać na tych zajęciach L-systemów do generacji rysunków. Każdy symbol l-systemu będzie odpowiadał odpowiedniej operacji malowania. Do generacji rysunku z gramatyki będziemy używać grafiki żółwia. Każdy terminal odpowiada pewnej operacji żółwia. Grafika żółwia Żółw znajduje się w trójwymiarowym układzie współrzędnych. Żółw ma 3 atrybuty: pozycję, orientację, mazak, który ma takie atrybuty jak kolor, grubość, dół lub góra (dół oznacza, że mazak przykładany jest do papieru). Żółw porusza się po układzie za pomocą komend, które odnoszą do jego aktualnego położenia. Przykładowe komendy z programu JFLAP: terminal g - oznacza przesunięcie do góry + - oznacza obrót w prawo o wcześniej zdefiniowaną liczbę stopni Przykład 1. X gggx + g Aksjomatem jest X. Pierwsza iteracja: X gggx + g
Na rysunku będą 3 kreski do góry, + oznacza obrócenie się w prawo, i jedna kreska w prawy górny róg (Rysunek 1). Druga iteracja: X ggggggx + g + g Rysunek 1 Na rysunku będzie 6 kresek do góry, jedna kreska w bok i druga kreska w bok, ale pod większym kątem (Rysunek 2). itd. Przykład 2. X g [~+Yg]gX Y +Y Aksjomat: X. Pierwsza iteracja: Rysunek 2 X g [~+Yg]gX Nawiasy kwadratowe oznaczają stos. Najpierw renderowane są wszystkie symbol poza stosem, a na samym końcu stos. Stos jest renderowany począwszy od pozycji w której się znajdował. Zastosowanie stosu pozwala na robienie odgałęzień. Tylda oznacza zmniejszenie grubości linii. W pierwszej iteracji najpierw rysujemy kreskę do góry, później kolejną kreskę do góry. Następnie przetwarzamy stos. Zaczynając od pozycji po pierwszej kresce zmniejszamy grubość linii, obracamy żółwia w prawo i rysujemy kreskę (Rysunek 3).
Rysunek 3 Druga iteracja: g [~+Yg]gX g[~++yg]gg [~+Yg]gX W drugiej iteracji będą najpierw cztery kreski do góry, później będzie przetwarzany pierwszy stos, gdzie odchylamy się dwukrotnie w prawo i rysujemy kreskę. Na drugim stosie odchylamy się jednokrotnie w prawo i rysujemy kreskę (Rysunek 4). Przykład 3. Gramatyka postaci: B [~##TL-B++B] L [{-g++g%--g}] R!@@R T Tg Aksjomatem będzie w tym wypadku łańcuch: R ~##B Znaczenie symboli: Rysunek 4 % oznacza obrócenie żółwia w prawo o 180 stopni {} - nawiasy klamrowe oznaczają, że to co jest wewnątrz definiuje wierzchołki wielokąta, który będzie wypełniony. Pierwszym wierzchołkiem jest aktualne położenie. ## (pisane razem w JFLAP) oraz @@ (pisane razem w JFLAP): operatory zmieniające kolor wypełnienia wielokąta - obrócenie żółwia w lewo! - zwiększenie grubości linii Pierwsza iteracja:
R ~##B R~## [~##TL-B++B ] W pierwszej iteracji nie ma terminala g, a więc nic nie rysujemy. Druga iteracja: R ~ ## [ ~ ## T g [ { - g + + g % - - g } ] - [ ~ ## T L - B + + B ] + + [ ~ ## T L - B + + B ] ] W powyższej iteracji będzie namalowana kreska do góry, a później to co znajduje się w pierwszym stosie, czyli zdefiniowany wielokąt, który zostanie wypełniony (Rysunek 5). Rysunek 5 Dodatkowe komendy: f - przesuwanie bez rysowania +, -, &, ^, /, *- zestaw komend obracających żółwia w każdym wymiarze #, @ - zmieniają kolor linii Bibliografia 1. [Online] http://en.wikipedia.org/wiki/l-system. 2. [Online] http://www.jflap.org/tutorial/lsystem/index.html.
Zadania Proszę mieć na uwadze, że pomiędzy symbolami w JFLAP podczas wpisywania l-systemów powinny być spacje. Zadania na 3.0 Wymyślić lub znaleźć l-system, który generuje ciekawy rysunek wykorzystując do tego rysowanie kresek, obracanie w prawo i w lewo. Uruchomić go w JFLAP. Zadania na 4.0 Wymyślić lub znaleźć l-system, który generuje ciekawy rysunek wykorzystując do tego stos, dekrementację/inkrementację grubości linii oraz wypełnianie wielokątów. Uruchomić go w JFLAP. Zadania na 5.0 W pewnym L-systemie po kilku początkowych krokach otrzymujemy dwa złączone ze sobą okręgi, które w kolejnych krokach obracają się wokół punktu startowego. Kąt jest zdefiniowany na 10 stopni. Znaleźć ten l-system. Rysunek 6 Rysunek 7