Visualisierung limitierter Lindenmayer
Transcrição
Visualisierung limitierter Lindenmayer
Studienarbeit Visualisierung limitierter Lindenmayer-Systeme Technische Universität Carolo-Wilhelmina zu Braunschweig Institut für Theoretische Informatik Prof. Dr. Adámek Prof. Dr. Wätjen Betreuer: Prof. Dr. Wätjen Vorgelegt von Frank Böhmer Matr.-Nr. 2582133 Braunschweig, Dezember 2002 Inhaltsverzeichnis 1 2 3 4 5 6 7 Einleitung ........................................................................................................................... 4 Lindenmayer-Systeme........................................................................................................ 5 2.1 0L-Systeme................................................................................................................. 5 2.2 Limitierungen ............................................................................................................. 6 2.3 Parametrische L-Systeme ........................................................................................... 6 2.4 Kontextsensitivität...................................................................................................... 6 Vergleich limitierter mit nicht limitierten Systemen.......................................................... 8 3.1 Mögliche Anwendungen .......................................................................................... 10 Bedienung von 0L ............................................................................................................ 11 4.1 Voraussetzungen ...................................................................................................... 11 4.2 Installation................................................................................................................ 11 4.3 Programmoberfläche ................................................................................................ 11 Beschreibungssprache ...................................................................................................... 14 5.1 Formatfreiheit........................................................................................................... 14 5.2 Kommentare ............................................................................................................. 14 5.3 Programmstruktur..................................................................................................... 14 5.4 Konstantendefinition ................................................................................................ 14 5.5 Symboldefinition...................................................................................................... 15 5.6 Axiomdefinition ....................................................................................................... 15 5.7 Substitutionen........................................................................................................... 16 5.8 Limitierungen ........................................................................................................... 17 5.9 Interpretation ............................................................................................................ 17 5.9.1 Interpretation „turtle2d“ ................................................................................... 18 5.9.2 Interpretation „turtle3d“ ................................................................................... 19 5.10 Mathematische Funktionen ...................................................................................... 20 5.11 Mathematische Konstanten ...................................................................................... 21 5.12 Boolesche Ausdrücke............................................................................................... 21 5.13 Formale Syntax ........................................................................................................ 22 Architektur ....................................................................................................................... 26 6.1 Parser........................................................................................................................ 26 6.2 Interpretation ............................................................................................................ 26 6.3 Klassendiagramme ................................................................................................... 27 6.3.1 System .............................................................................................................. 27 6.3.2 Substitutionen................................................................................................... 27 6.3.3 Worte und Symbole.......................................................................................... 28 6.3.4 Arithmetische Ausdrücke ................................................................................. 28 6.3.5 Boolesche Ausdrücke....................................................................................... 29 6.3.6 Interpretation .................................................................................................... 29 Anhang ............................................................................................................................. 30 2 7.1 Beispiel für ein Lindenmayer-System...................................................................... 30 8 Abbildungsverzeichnis ..................................................................................................... 32 9 Literaturverzeichnis.......................................................................................................... 33 3 1 Einleitung Zurückgehend auf den Biologen Aristid Lindenmayer haben Lindenmayer-Systeme eine vielseitige Entwicklung durchgemacht. Eingeführt als System zur Beschreibung der parallelen Zellteilungsprozesse einfacher Organismen (z.B. Algen) wurde bald das Interesse sowohl von der theoretischen Informatik [5] als auch der Computergraphik [4] geweckt. In der theoretischen Informatik wurde und wird die Einordnung von Lindenmayer-Systemen in die Chomsky-Hierarchie der formalen Sprachen sowie die Abgeschlossenheit unter verschiedenen Operationen (insbesondere der AFL-Operationen) betrachtet. D. Wätjen führte in [8] und [9] Limitierungen von Lindenmayer-Systemen ein, die das Wachstum beschränken. Zur Generierung natürlich anmutender Pflanzen oder zur Erzeugung abstrakter, aber ästhetischer Graphiken werden in der Computergraphik u.a. Lindenmayer-Systeme eingesetzt. Dazu wurden die Systeme um reellwertige Parameter und bedingte Produktionen erweitert. Zur Interpretation kommt in der Regel das Turtle-Modell zum Einsatz. In der vorliegenden Arbeit sollen limitierte Lindenmayer-Systeme und diese der Computergraphik zusammengeführt werden. Dabei steht der praktische Teil im Vordergrund, auf die theoretische Untermauerung soll lediglich verwiesen werden. Im Rahmen dieser Arbeit ist eine Applikation – namentlich „0L“ – entstanden [1], die die Berechnung und Interpretation von Lindenmayer-Systemen mittels zwei- und dreidimensionaler TurtleGraphik erlaubt. 4 2 Lindenmayer-Systeme Im folgenden sollen die in 0L verwendeten Eigenschaften und Erweiterungen von Lindenmayer-Systemen formal definiert werden. 2.1 0L-Systeme Definition 3.1: Ein Tripel G = (Σ, h, ω) heißt 0L-System, wenn gilt: (1) Σ ist eine endliche Menge, (2) h : Σ → ℘(Σ*) ist eine nichtleere endliche Substitution, (3) ω ∈ Σ*. Dann bezeichnen wir Σ als das Alphabet, die Elemente von Σ als Symbole und Elemente aus Σ* als Wörter über Σ. Das leere Wort bezeichnen wir mit ε. Definition 3.2: Sei G = (Σ, h, ω) ein 0L-System p: a → w ist genau dann eine Produktion in G, wenn w ∈ h(a) gilt. h beschreibt also eine Menge von Produktionen. Definition 3.3: Es sei G = (Σ, h, ω) ein 0L-System, w ∈ Σ* und i ∈ ù, i > 0. Dann sei L0 (G, w) := {w} und Li (G, w) := {v ∈ Σ * | v ∈ h i ( w)} . Damit folgt ∞ L(G ) = U Li (G, ω ) . i =0 Definition 3.4: (1) Es sei G ein 0L-System. v leitet w direkt (in G) ab (bezeichnet mit v ⇒ G w ), wenn w ∈ L1 (G, v) gilt. (2) w leitet v in n Schritten (in G) ab (bezeichnet mit v ⇒ Gn w ), wenn w ∈ Ln (G, v) gilt. (3) w leitet v (in G) ab (bezeichnet mit v ⇒ *G w ), wenn w ∈ Ln (G, v) für ein beliebiges n ∈ ù gilt. Definition 3.5: Ein 0L-System G = (Σ, h, ω) heißt propagierend, wenn gilt: ∀ a ∈ Σ : ε ∉ h(a). Ein solches System bezeichnen wir auch als P0L-System. Es ist leicht ersichtlich, dass die Wortlänge in einem P0L-System mit jedem Ableitungsschritt wächst oder wenigstens konstant bleibt. Definition 3.6: Ein 0L-System G = (Σ, h, ω) heißt deterministisch, wenn gilt: ∀ a ∈ Σ : |h(a)| = 1. Somit ist für jedes Wort nur genau eine Ableitung möglich. Ein deterministisches 0L-System bezeichnen wir als D0L-System. Ist ein 0L-System deterministisch und propagierend, so bezeichnen wir es als PD0L-System. Beispiel 3.1: Sei G = (Σ, h, ω) ein 0L-System mit Σ = {a, b, c}, ω = a, h(a) = bac, h(b) = a, h(c) = a. Dann ist G propagierend und deterministisch mit folgender Ableitung: a ⇒ bac ⇒ abaca ⇒ bacabacabac ⇒ ... 5 2.2 Limitierungen Limitierte 0L-Systeme werden in [7], [8] und [9] betrachtet. Die Idee ist, dass die vollständige parallele Ersetzung bei 0L-Systemen nicht ausreicht, um natürliche Wachstumsprozesse zu beschreiben, da diese durch Ressourcenknappheit und andere äußere Einflüsse beschränkt sind. Die Limitierung eines L-Systems bedeutet eine Einschränkung der Substitution: in einem Ableitungsschritt werden nicht mehr alle möglichen Ersetzungen vorgenommen, sondern nur eine Teilmenge. Definition: Sei k ∈ ù, k > 0, weiterhin sei h: Σ →℘(Σ*) eine endliche Substitution. hk(w): Σ* →℘(Σ*) ist eine k-Limitierung von h, wenn hk(w) genau die Menge der Wörter ist, die sich erzeugen lassen, indem für jedes Symbol a ∈ Σ genau min{#aw, k} Vorkommen in w ersetzt werden. Definition: Sei k ∈ ù, k > 0, weiterhin sei h: Σ →℘(Σ*) eine endliche Substitution. hk(w): Σ* →℘(Σ*) ist eine uniforme k-Limitierung von h, wenn hk(w) genau die Menge der Wörter ist, die sich erzeugen lassen, indem genau min{|w|, k} Symbole in w ersetzt werden. 2.3 Parametrische L-Systeme Parametrische L-Systeme werden in [3], Kapitel 3.1 betrachtet. Die Erweiterung bezüglich normaler L-Systeme besteht darin, dass die Symbole des Alphabets mit reellwertigen Parametern ausgestattet werden, diese werden als Moduln bezeichnet. Ein Modul mit Buchstaben A ∈ Σ und den Parametern a1, a2, ..., an ∈ R wird bezeichnet mit A(a1, a2, ..., an). Die Menge der Moduln nennen wir M := (Σ × R*). Parametrische Wörter sind Wörter über die Moduln. Gegenüber den reellwertigen Parametern stehen die formalen Parameter, die benötigt werden, um die Substitution des L-Systems zu spezifizieren. Für eine Menge Φ formaler Parameter soll C(Φ) die Menge der logischen Ausdrücke und E(Φ) die Menge der arithmetischen Ausdrücke über Φ sein. Definition: Ein Quadrupel G = (Σ, Φ, h, ω) ist ein parametrisches L-System, wenn gilt: (1) Σ ist eine endliche Menge, das Alphabet des Systems, (2) Φ ist eine Menge formaler Parameter, (3) ω ∈ (Σ × R*)+ ist das Axiom des Systems, (4) h: (Σ × Φ*) × C(Φ) → (Σ × E(Φ)*)* ist eine endliche Menge von Produktionen. Die durch h beschriebenen Produktionen schreiben wir auch als p: a | φ → w, wobei * * * a ∈ (Σ × Φ ), φ ∈ C(Φ) und w ∈ (Σ × E(Φ) ) ist. Eine Produktion p: a | φ → w wird dann auf ein Modul b angewandt, wenn a und b das selbe Symbol s ∈ Σ tragen, die Zahl der formalen Parameter in a mit der Zahl der reellwertigen Parameter in b übereinstimmt und der durch die reellwertigen Parameter von b bewertete logische Ausdruck φ erfüllt ist. b wird dann durch die Bewertung von w ersetzt. 2.4 Kontextsensitivität Die bisher betrachteten Produktionen sind kontextfrei. Wir wollen nun parametrische LSysteme noch um kontextsensitive Produktionen erweitern. Im Gegensatz zu 0L-Systemen werden L-Systeme, deren Produktionen kontextsensitiv sind 2L-Systeme genannt, als Spezialfall dieser ergeben sich noch die 1L-Systeme, bei denen der Kontext jeweils nur auf der linken oder nur auf der rechten Seite des zu ersetzenden Symbols auftaucht. Diese Differenzierung soll im folgenden nicht betrachtet werden. 6 Um Kontextsensitivität einzuführen, muss im Wesentlichen nur die Substitution erweitert werden: Definition: Ein Quadrupel G = (Σ, Φ, h, ω) ist ein kontextsensitives, parametrisches LSystem, wenn gilt: (1) Σ ist eine endliche Menge, das Alphabet des Systems (2) Φ ist eine Menge formaler Parameter (3) ω ∈ (Σ × R*)+ ist das Axiom des Systems (4) h: (Σ × Φ*)* × (Σ × Φ*) × (Σ × Φ*)* × C(Φ) → (Σ × E(Φ)*)* ist eine endliche Menge von Produktionen Die durch h beschriebenen Produktionen schreiben wir auch als p: v1 < a > v2 | φ → w * * * * * wobei a ∈ (Σ × Φ ), v1, v2 ∈ (Σ × Φ ) , φ ∈ C(Φ) und w ∈ (Σ × E(Φ) ) ist. Sein p eine Produktion v1 < a > v2 | φ → w und sei u1bu2 ein Teilwort mit u1, u2 ∈ (Σ × R*)* und b ∈ (Σ × R*). p wird dann auf u1bu2 angewandt, wenn gilt: (1) v1av2 = x1x2...xn passt auf u1bu2 = y1y2...ym, d.h. m = n, die Moduln xi und yi tragen jeweils das selbe Symbol und die Zahl der formalen Parameter von xi stimmt mit der Zahl der reellwertigen Parameter von yi überein (für alle i ∈ {1, 2, ..., n}). (2) Der durch die reellwertigen Parameter von u1bu2 bewertete logische Ausdruck φ ist erfüllt. b wird dann durch die Bewertung von w ersetzt. 7 3 Vergleich limitierter mit nicht limitierten Systemen Es kann gezeigt werden, dass die Erzeugungsmächtigkeit limitierter Lindenmayer-Systeme größer ist als die von nicht limitierten – siehe [7], Satz 14.11: ∀ k ∈ N: L(ET0L) ⊂ L(klET0L)). Daraus ergibt sich die Frage, inwieweit dies von praktischer Bedeutung sein kann, also ob Wachstumsprozesse besser beschrieben werden. Im Folgenden soll demonstriert werden, wie limitierte System zumindest subjektiv ein „natürlicheres“ Wachstum aufzeigen. Dazu sollen zunächst zwei Bäume betrachtet werden, die mit 0L generiert wurden. Das zugrundeliegende System (siehe 7.1) ist identisch, mit der einzigen Ausnahme, dass bei dem rechten Baum eine konstante, uniforme Limitierung (k = 10) verwendet wurde. Abbildung 1 Baum ohne Limitierung Abbildung 2 Baum mit Limitierung Da das zugrundeliegende Lindenmayer-System deterministisch ist, führt eine Berechnung ohne Limitierung immer zum gleichen Ergebnis; durch Einführung einer Limitierung wird das System jedoch nichtdeterministisch (Es ist leicht einzusehen, dass die Ableitung für ein beliebiges Lindenmayer-System nichtdeterministisch ist, sobald das Wachstum die Limitierung überschreitet.). Das heißt, dass der Baum in Abbildung 1 nur ein Wort einer möglichen Ableitung repräsentiert. Um dies zu verdeutlichen seien vier weitere Ableitungen gezeigt (alle in der selben Ableitungstiefe, berechnet mit jeweils anderen Startwerten in 0L): 8 Ableitung 1 Ableitung 2 Ableitung 3 Ableitung 4 Abbildung 3 Nichtdeterministische Ableitung Die Zahl der möglichen Ableitungen einer bestimmten Tiefe t wächst abhängig vom System zum Teil sehr stark mit t. Dies soll exemplarisch verdeutlicht werden: Sei G = (Σ, h, ω) ein 0L-System mit Σ := {a, b, c, d}, ω := a und h(a) = bcd, h(b) = acd, h(c) = abd, h(d) = abc. Das System ist offenbar deterministisch, die (einzige) Ableitungsfolge lautet: a ⇒ bcd ⇒ acd abd abc ⇒ bcd abd abc bcd acd abc bcd acd abd ⇒ ... Die Wortlänge wächst mit 3t. Betrachten wir nun das gleiche System mit uniformer Limitierung von k := 3. Eine mögliche Ableitung ist (mit rein linkslastigen Ersetzungen): a ⇒ bcd ⇒ acd abd abc ⇒ bcd abd abc abd abc ⇒ acd abd abc abd abc abd abc ⇒ ... Die Länge eines Wortes w der Ableitungstiefe t beträgt |wt| = 6t – 3 für t ≥ 1. Es können in jedem Ableitungsschritt nur 3 Symbole zur Ersetzung ausgewählt werden, dies ergibt 9 | w | 6t − 3 mt := t = 3 3 verschiedene Ableitungswege im Schritt t. Damit ergibt sich die Zahl der möglichen Ableitungen einer Tiefe t zu: t −1 t −1 6i − 3 Mt = ∑ mi = ∑ 3 i =1 i =1 t −1 = 1 ∑ 6 (6i − 3)(6i − 4)(6i − 5) i =1 t −1 ≥ ∑ (i − 1) i =1 3 t −2 = ∑i i =0 3 = 1 (t − 2) 2 (t − 1) 2 4 Es ergibt sich zwar lediglich polynomiales Wachstum der Ableitungsmöglichkeiten, dabei ist aber zu beachten, dass die Wortlänge nur linear wächst, die Zahl der Ableitungsmöglichkeiten wächst also erheblich stärker als die Wortlänge. Wenn das Wachstum des unlimitierten Systems auf das beschränkte Wachstum abgebildet wird (das ist durchaus sinnvoll, da der Sinn der Limitierung ja nicht darin liegt, kürzere Wörter zu erzeugen), ergibt sich folgender Zusammenhang: 1 3t1 = 6t 2 − 3 ⇔ t 2 = 3t1 + 3 6 Damit ist die Zahl der Ableitungsmöglichkeiten für ein Wort der Länge 3t 1 1 1 1 1 4t M t1 ≥ ( 3t1 + 1) 2 ( 3t1 + 2) 2 ≥ 3 4 6 6 4 64 3.1 Mögliche Anwendungen Lindenmayer-Systeme stellen eine ausgesprochen effiziente Komprimierung von PflanzenModellen dar. Durch den inhärenten Nichtdeterminismus limitierter Lindenmayer-Systeme lassen sich fast beliebig viele verschiedene – jedoch einander ähnelnde – Pflanzen-Modelle aus einem System ableiten. Zudem erfordert die Berechnung eines statisch implementierten Systems vergleichsweise wenig Aufwand. Es liegt also eine Anwendung nahe, in der große Pflanzenbestände generiert werden müssen. Zum Beispiel bei der Simulation eines Waldes in Computerspielen oder in Applikationen zur Landschaftsplanung könnten limitierte Lindenmayer-Systeme zum Einsatz kommen, bei denen die Bäume in Echtzeit nur für den gerade sichtbaren Ausschnitt berechnet werden. Es ergäbe sich daraus eine erheblich größere Vielfalt, ohne dass die Speicheranforderungen erhöht würden. Da sich zudem noch das Alter jedes Baumes kontrollieren ließe würde dies zu einem natürlicheren Gesamteindruck führen und zugleich den Aufwand für das Design der Bäume einsparen. Durch Limitierungen ergibt sich noch ein weiterer Vorteil: Das Wachstum wird linear beschränkt und lässt sich somit besser kontrollieren, während es bei nicht-limitierten Systemen nur exponentiell beschränkt ist. So werden im obigen Beispiel ohne Limitierung lediglich elf Ableitungsschritte benötigt, um einen bereits sehr komplexen, ausgewachsenen Baum zu erzeugen. In der limitierten Version hingegen benötigt ein ähnliches Ergebnis, abhängig von der Limitierung, mehrere hundert bis tausend Schritte. Dadurch wird ein feingranulierter Wachstumsprozess möglich, der eine realistische Simulation erlaubt. 10 4 Bedienung von 0L 4.1 Voraussetzungen Um 0L starten zu können, muss auf dem System eine Java Runtime Environment (JRE) ab Java Version 1.3 sowie das zusätzliche Paket Java 3D installiert sein. Beides ist für verschiedene Plattformen (Linux, Solaris, Windows etc.) erhältlich; unter [6] sind weitere Informationen und die genauen Links zu finden. 4.2 Installation Eine Installation ist nicht notwendig. Das Programm 0L besteht einzig aus der Datei „lindenmayer.jar“, die durch folgenden Aufruf gestartet werden kann: > java –jar lindenmayer.jar Voraussetzung ist dabei, dass „java“ sich im Pfad befindet. Windows-Benutzer können die Applikation alternativ durch Doppelklick starten. 4.3 Programmoberfläche Abbildung 4 Programmoberfläche Nach dem Start präsentiert 0L zunächst ein leeres Projekt. Im Menü „Project“ kann mit „New Window“ ein weiteres leeres Projektfenster geöffnet werden. „Open...“ lädt eine Datei in das aktuelle Projektfenster, sofern dieses leer ist, oder erzeugt ein neues Projektfenster. „Save“ speichert das aktuelle Projekt. Ist dieses noch nicht betitelt, so wird ein Dateidialog geöffnet mit der Aufforderung, einen Dateinamen zu wählen. Mit „Save As...“ kann ein Projekt unter einem neuen Dateinamen gespeichert werden. Im oberen Fensterbereich sind drei Registerkarten zu sehen. „Editor“ enthält den Projekteditor, in dem das zu berechnende Lindenmayer-System in der Beschreibungssprache (siehe Kapitel 5) spezifiziert wird. Unter „Derivation“ ist die aktuelle Ableitungsfolge zu sehen, Worte werden ab einer Länge von 255 Symbolen (nicht dargestellter Zeichen) abgeschnitten. „Selected Word“ zeigt das unter „Derivation“ gewählte Wort vollständig an. Im rechten Fensterbereich sind die Kontrollelemente untergebracht. Da die Ableitung in vielen Fällen nicht deterministisch ist, kann unter „Seed for randomizer“ ein Startwert für den Zufallsgenerator eingegeben werden, der bestimmt, auf welche Weise ein Wort abgeleitet 11 wird. Wird der gleiche Startwert für zwei Ableitungen des selben Systems genutzt, so ist auch die Ableitung die gleiche. Mittels eingeschaltetem „Random seed“ wird vor jeder AbleitungsBerechnung ein neuer Startwert eingetragen. Die Ableitungsberechnung lässt sich anhand zweier Parameter beschränken: „Maximal depth“ gibt den Maximalwert für die Tiefe der Ableitung an, bei einem Wert von n werden maximal n+1 Worte erzeugt (n abgeleitete Wörter und das Axiom). „Maximal word length“ beschränkt die maximale Länge der abgeleiteten Wörter. Wird diese überschritten, so stoppt der Ableitungsprozess. Es werden folglich so viele Ableitungsschritte berechnet, bis eines der Beschränkungskriterien erfüllt ist. Der Ableitungsprozess kann mit „Start Derivation“ gestartet und mit „Stop Derivation“ vorzeitig abgebrochen werden. „Star Derivation“ aktiviert außerdem die Registerkarte „Derivation“, in der der Ableitungsprozess mitverfolgt werden kann. Abbildung 5 Der Ableitungsprozess Wird ein Wort in der Ableitungsfolge ausgewählt, so kann dieses unter „Selected Word“ betrachtet werden. Die Interpretation dieses Wortes wird mit „Interpretation“ gestartet: Ein neues Fenster öffnet sich und zeigt – je nach Beschreibung – die zweidimensionale bzw. dreidimensionale graphische Darstellung an. 12 Abbildung 6 Interpretation 3D Abbildung 7 Interpretation 2D Die Navigation in der dreidimensionalen Darstellung erfolgt im Wesentlichen über die Maus. Bei gedrückter linker Maustaste kann die Kamera um den Nullpunkt rotiert werden. (Der Nullpunkt ist die Startposition des Turtles bei der Interpretation, also in der obigen Abbildung z.B. das untere Ende das Baumstammes.) Mit gedrückter rechter Maustaste kann die Kamera geschwenkt werden (das Entspricht subjektiv dem Verschieben der Darstellung). Schließlich kann mittels gedrückter mittlerer Maustaste (alternativ „Alt“ und linke Maustaste) in die Szene hinein- bzw. herausgezoomt werden. Wird das Fenster vergrößert, so vergrößert sich entsprechend auch die Darstellung. In der zweidimensionalen Ansicht ist keine Navigation möglich, die Darstellung wird so gestreckt, dass sie optimal im Fenster Platz findet. 13 5 Beschreibungssprache Lindenmayer-Systeme werden in 0L mit Hilfe einer speziellen Sprache beschrieben, die ein höheres Maß an Flexibilität bietet, als dies durch eine statische Eingabemaske zu erreichen wäre. Die Notation weicht zwangsläufig von der üblichen formalen Notation ab. 5.1 Formatfreiheit Die Beschreibungssprache von 0L ist formatfrei, d.h. Whitespace, also Leerzeichen, Tabulatoren und Zeilenumbrüche, kann beliebig zur Strukturierung genutzt werden. 5.2 Kommentare Kommentare dürfen an beliebiger Stelle im Quelltext auftreten. Die Syntax ist die aus C++ und Java bekannte: // Kommentar für einzeilige Kommentare, d.h. der Rest der Zeile wird ignoriert bzw. /* Kommentar ... */ für Kommentarblöcke, also auch mehrzeilig. 5.3 Programmstruktur Der generelle Aufbau einer Lindenmayer-System-Beschreibung sieht folgendermaßen aus: constants = (<constant-definition>); symbols = (<symbol-definition>); axiom = <word >; substitution = ( table = ( <substitution>* ); ); limitation:<type>[ = <function>]; interpretation:<type> = ( <symbol-interpretation>* ); Keiner dieser Abschnitte darf fehlen. 5.4 Konstantendefinition Um das Experimentieren mit verschiedenen Parametern zu erleichtern, können Konstanten definiert werden. Dies geschieht im Abschnitt constants. Konstantenbezeichner (<identifier>) beginnen mit einem Buchstaben gefolgt von einer beliebigen Kombination aus Buchstaben und Zahlen. Sonderzeichen bzw. Umlaute sind nicht erlaubt. Bezeichner werden in 0L generell Case-Sensitive behandelt, d.h. Groß- und Kleinschreibung ist relevant. Erlaubt sind folgende Ausdrücke innerhalb von <constant-definition>: <identifier> = <value>; <identifier> = <expression>; 14 Wobei <value> ein beliebiger numerischer Wert in Dezimalschreibweise (z.B. „0.1“, „5“, eine Null vor dem Dezimalpunkt darf nicht ausgelassen werden) sein kann. <expression> kann ein arithmetischer Ausdruck sein, erlaubt sind Addition „+“, Subtraktion „-“, Multiplikation „*“ sowie Division „/“ als Operationen, weiterhin mathematische Funktionen (siehe 5.10) sowie mathematische Konstanten (siehe 5.11) und in vorhergehenden Anweisungen definierte Konstanten als Operanden Beispiel: constants = ( q = 0.40; leafMin = 50; leafScale = 1.5; // Berechnungen, e ist eine mathematische Konstante q1 = pow(q, e); q2 = pow(1-q, e); ); 5.5 Symboldefinition Alle Symbole des Lindenmayer-Systems müssen im Abschnitt symbols definiert werden. Dies geschieht durch Aneinanderreihung der Symboldefinitionen, Whitespace kann zur Trennung der Symboldefinitionen genutzt werden, dies ist aber nicht zwingend. Eine Symboldefinition besteht aus einem Symbolbezeichner sowie eine optionalen Symbolsignatur, wenn es sich um ein parametrisiertes Symbol handelt. Symbolbezeichner beginnen mit einem Buchstaben oder einem der folgenden Sonderzeichen: [ ] ? # ~ ^ & % $ " + - _ Auf das erste Zeichen kann eine beliebig lange Kombination von Ziffern folgen. Die optionale Signatur ist die in runden Klammer eingeschlossene, durch Kommata getrennte Aufzählung der Parametertypen. Zur Zeit ist nur der Typ real für „reelle“ Zahlen (In der Implementierung werden Fließkommazahlen doppelter Genauigkeit verwendet.). Beispiel: symbols = ( aAX0X1 y(real, real) z(real) ); Es werden somit sechs Symbole definiert: a, A, X0, X1, y, z. Das Symbol y ist mit zwei reellwertigen und das Symbol z einem reellwertigen Parameter ausgestattet. Zu beachten ist, dass die hier definierte Signatur bei allen folgenden Symbolverwendungen eingehalten werden muss. Beispielsweise würde y(1) eine Fehlermeldung verursachen. 5.6 Axiomdefinition Das Axiom wird im Abschnitt axiom definiert. Erlaubt ist ein beliebiges Wort (auch das leere, wenngleich wenig sinnvoll) über die in symbols definierten Symbole. Bei parametrischen Symbolen müssen die einzelnen Parameter mit Werten belegt werden. Dies können numerische Werte sein, aber auch arithmetische Ausdrücke unter der Verwendung der allgemeinen mathematischen sowie der in constants definierten Konstanten. Näheres ist im Kapitel 5.4 unter der Definition von <value> und <expression> zu finden. Beispiel: axiom = X0y(1, pow(q2, e) * leafMin)z(leafScale); 15 5.7 Substitutionen Innerhalb des substitution-Blocks werden die Tafeln mittels table-Blöcken definiert. Wird nur eine Tafel angegeben, so kann der umschließende substitution-Block auch weggelassen werden. Innerhalb eines table-Blocks werden die eigentlichen Ersetzungsregeln angegeben. Eine Ersetzungsregel besteht aus einem optionalen linken Kontext, dem zu ersetzenden Symbol, einem optionalen rechten Kontext, einer optionalen Bedingung sowie dem Ersetzungswort. Linker und rechter Kontext werden dabei in spitzen Klammern („<>“) angegeben, die Bedingung durch einen senkrechten Strich („|“) abgetrennt, das Ersetzungswort durch ein Gleichheitszeichen („=“). Die Parameter der Symbole des linken und rechten Kontexts beziehungsweise des zu ersetzenden Symbols müssen mit Variablen belegt werden. Diese Variablen können in der Bedingung als auch auf der rechten Seite der Substitution verwendet werden. Die Bedingung ist ein beliebiger boolescher Ausdruck (siehe 5.12); ist die Bedingung nicht erfüllt, so wird die Substitution nicht angewandt. Die Parameter der Symbole des Ersetzungswortes müssen mit Werten belegt werden. Dies können numerische Werte und arithmetische Ausdrücke sein, die von den allgemeinen mathematischen und den in constants definierten Konstanten sowie von den Variablen der linken Seite der Substitution abhängen (siehe Kapitel 5.4, Definition von <value> und <expression>). Beispiel: <X0z(x0)> y(x1, x2) <X1> | x0 >= x1*x2 = X0y(x0*x1, x0+x2)X1; Innerhalb einer Tafel können beliebig viele Ersetzungsregeln angegeben werden, sind sie hinsichtlich Ersetzungssymbol, Kontext und Bedingung nicht disjunkt, so führt dies zu nichtdeterministischen Ableitungen. Ist keine der Regeln auf ein Symbol anwendbar, so impliziert dies die identische Ersetzung für dieses Symbol. Bei Angabe mehrerer Tafeln wird vor jedem Ableitungsschritt zufällig eine Tafel gewählt, die Symbole des Wortes werden dann nach den Regeln der gewählten Tafel abgeleitet. Beispiel: substitution = ( table = ( a = y(0, 0); y(a, b) = y(a*b, b+1); <y(a, b)> z(c) | c < a*b = z(c*1.1); ); table = ( a = A; y(a, b) = X0; z(a) = X1 ; ); ); 16 5.8 Limitierungen Soll das System nicht beschränkt sein, so ist dies mit limitation:none; anzugeben. Uniforme und normale Limitierungen werden durch einen arithmetische Ausdruck bestimmt, der von der Variable n abhängen kann, die die Ableitungstiefe repräsentiert. Ist das Ergebnis nicht ganzzahlig, so wird die nächstkleinere ganze Zahl angenommen. Ein Ergebnis kleiner Null hat den gleichen Effekt wie Null: Es wird keine Ersetzung vorgenommen. Beispiel: limitation:normal = 5; limitation:uniformly = pow(2, n); 5.9 Interpretation Im Abschnitt interpretation wird die Interpretation der Symbole definiert, das heißt die Zuordnung von Symbol zu einer Folge von Anweisungen an die Visualisierung. Hinter dem Schüsselwort interpretation wird durch Doppelpunkt getrennt der Typ der Visualisierung festgelegt. Visualisierungstypen: Bezeichnung Beschreibung turtle2d zweidimensionale Turtle-Interpretation turtle3d dreidimensionale Turtle-Interpretation Innerhalb des interpretation-Blocks kann für jedes Symbol eine Reihe von Anweisungen (statements) angegeben werden. Die Visualisierung stellt sowohl Variablen als auch Methoden zur Verfügung, die in den Anweisungen genutzt werden können, genaueres dazu in den Kapiteln 5.9.1 und 5.9.2. Eine Anweisung ist entweder eine Zuweisung in der Form <variable> = <expression>; oder ein Methodenaufruf (ohne Auswertung des Ergebnisses): <method>(<parameter_list>); wobei die durch Kommata separierten Parameter in <parameter_list> wieder arithmetische Ausdrücke (<expression>) sind. 17 Beispiel: interpretation:turtle3d = ( y(a, b) = ( rotateX(a); rotateY(b); ); z(l) = ( draw(l); ); X0 = ( push(); ); X1 = ( pop(); ); a = ( setMaterial(green); ); ); 5.9.1 Interpretation „turtle2d“ Der 2D-Turtle bewegt sich auf einer Ebene, seine Orientierung ist durch die Rotation um den die aktuelle Position gegeben. y x Abbildung 8 Orientierung des 2D-Turtles Der Turtle verfügt über eine Stack, auf dem der aktuelle Zustand gespeichert werden kann. Ein Zustand des Turtles besteht aus Rotationswinkel, Position, Liniendicke sowie Linienfarbe. Methoden: Methode move(l) Beschreibung draw(l) Zeichnet eine Linie Bewegungsrichtung rotate(alpha) Rotiert den Turtle um alpha. stroke(d) Erhöht die Liniendicke um d. setRotation(alpha) Setzt die absolute Rotation auf alpha. getRotation() Gibt die absolute Rotation zurück setStroke(d) Setzt die Liniendicke auf d. Bewegt den Turtle um l nach vorne ohne zu zeichnen. der Länge l in 18 getStroke() Gibt die Liniendicke zurück. setColorRed(x) Setzt den Rot-Anteil der Linienfarbe auf x. getColorRed() Gibt den Rot-Anteil der Linienfarbe zurück. setColorGreen(x) Setzt den Grün-Anteil der Linienfarbe auf x. getColorGreen() Gibt den Grün-Anteil der Linienfarbe zurück. setColorBlue(x) Setzt den Blau-Anteil der Linienfarbe auf x. getColorBlue() Gibt den Blau-Anteil der Linienfarbe zurück. red() Setzt die Linienfarbe auf Rot. green() Setzt die Linienfarbe auf Grün. blue() Setzt die Linienfarbe auf Blau. push() Speichert den Zustand des Turtles auf dem Stack. pop() Lädt einen Turtle-Zustand vom Stack. Es werden keine Variablen bereitgestellt. 5.9.2 Interpretation „turtle3d“ Der 3D-Turtle bewegt sich in einem dreidimensionalen Raum mit rechtshändigem Inertialsystem. Der Turtle kann dabei um alle drei Achsen rotiert und in Richtung des durch die Rotation bestimmten Normalenvektors bewegt werden. Rotationen beziehen sich immer auf die aktuelle Ausrichtung des Turtles im Raum. y x z Abbildung 9 Orientierung des 3D-Turtles Ebenso wie der 2D-Turtle verfügt der 3D-Turtle über einen Stack, auf dem der vollständige Zustand gespeichert werden kann, also Orientierung, Position, Liniendicke und Materialfarbe. Methoden: Methode move(l) Beschreibung draw(l) Zeichnet einen Zylinder der Länge l. drawSphere(d) Zeichnet eine Kugel mit Durchmesser d. setLineWidth(d) Setzt den Durchmesser der mit draw Bewegt den Turtle um l nach vorne, ohne zu zeichnen. 19 erzeugten Zylinder auf d. incLineWidth(delta) Erhöht den Zylinderdurchmesser um delta. setMaterial(material) Setzt das Material, siehe Tabelle „Variablen“. rotateX(alpha) Rotiert den Turtle um die X-Achse. rotateY(alpha) Rotiert den Turtle um die Y-Achse. rotateZ(alpha) Rotiert den Turtle um die Z-Achse. rotate(alpha) Äquivalent zu rotateZ(alpha). push() Speichert den Zustand des Turtles auf dem Stack. pop() Lädt einen Turtle-Zustand vom Stack. Variablen: Variable brown Beschreibung green Materialfarbe grün. blue Materialfarbe blau. Materialfarbe braun. 5.10 Mathematische Funktionen Die folgenden mathematischen Funktionen können in allen arithmetischen Ausdrücken verwendet werden: Funktion pow(x, y) Ergebnis exp(x) ex sqr(x) x2 sqrt(x) x1/2 root(x, y) y1/x sin(a) sin(a), a im 360°-Maß cos(a) cos(a), a im 360°-Maß tan(a) tan(a), a im 360°-Maß max(x, y) max{x, y} min(x, y) min{x, y} abs(x) |x| xy 20 5.11 Mathematische Konstanten Als mathematische Konstanten stehen zur Verfügung: Variable Wert e e pi π 5.12 Boolesche Ausdrücke Boolesche Ausdrücke werden in den Bedingungen von Substitutionsregeln benutzt. Erlaubt sind die binären Operatoren and sowie or und der unäre Operator not. Als Operanden sind true und false sowie arithmetische Vergleiche zulässig. Um die Schreibweise zu vereinfachen, unterliegen die Operatoren der üblichen Rangordnung: not bindet stärker als and, and bindet stärker als or. Zur Gruppierung können runde Klammern eingesetzt werden. Ein arithmetischer Vergleich besteht aus einem linken arithmetischen Ausdruck, dem Vergleichsoperator und einem rechten arithmetischen Ausdruck. Die Tabelle der Vergleichsoperatoren: Operator a == b Bedeutung a <= b a≤b a >= b a≥b a < b a<b a > b a>b a != b a≠b a=b Beispiel: x > 2 and not (x != 3 or false) 21 5.13 Formale Syntax Im folgenden wird die formale Syntax der Beschreibungssprache in EBNF angegeben, Whitespaces und Kommentare werden dabei nicht berücksichtigt: SYSTEM = CONSTANTS_SECTION SYMBOLS_SECTION AXIOM_SECTION SUBSTITUTION_SECTION LIMITATION_SECTION INTERPRETATION_SECTION. CONSTANTS_SECTION = CONSTANTS ASSIGN LPAREN { CONSTANT_DEFINITION } RPAREN SEMICOLON. CONSTANT_DEFINITION = VARIABLE ASSIGN EXPRESSION_ARITHMETIC. SYMBOLS_SECTION = SYMBOLS ASSIGN LPAREN { SYMBOL_DEFINITION } RPAREN SEMICOLON. AXIOM_SECTION = AXIOM ASSIGN WORD_EXPRESSION SEMICOLON. SUBSTITUTION_SECTION = TABLE_DEFINITION | SUBSTITUTION ASSIGN LPAREN { TABLE_DEFINITION } RPAREN SEMICOLON. TABLE_DEFINITION = TABLE ASSIGN LPAREN { RULE } RPAREN SEMICOLON. 22 RULE = [ LT WORD_CONSTANT GT ] SYMBOL_VARIABLE [ LT WORD_CONSTANT GT ] [ PIPE EXPRESSION_BOOLEAN ] ASSIGN WORD_EXPRESSION SEMICOLON. LIMITATION_SECTION = LIMITATION COLON LIMITATION_TYPE [ ASSIGN EXPRESSION_ARITHMETIC ] SEMICOLON. LIMITATION_TYPE = NONE | NORMAL | UNIFORMLY. INTERPRETATION_SECTION = INTERPRETATION COLON INTERPRETATION_TYPE ASSIGN LPAREN { SYMBOL_INTERPRETATION } RPAREN SEMICOLON. SYMBOL_INTERPRETATION = SYMBOL_VARIABLE ASSIGN LPAREN { STATEMENT } RPAREN SEMICOLON. STATEMENT = ( ASSIGNMENT | METHOD_CALL ) SEMICOLON. ASSIGNMENT = VARIABLE ASSIGN EXPRESSION_ARITHMETIC. SYMBOL_DEFINITION = SYMBOL_IDENTIFIER [ LPAREN [ PARAMETER_TYPE { COMMA PARAMETER_TYPE } ] RPAREN ]. SYMBOL_VARIABLE = SYMBOL_IDENTIFIER [ LPAREN [ VARIABLE { COMMA VARIABLE } ] RPAREN ]. SYMBOL_EXPRESSION = SYMBOL_IDENTIFIER [ LPAREN [ EXPRESSION_ARITHMETIC { COMMA EXPRESSION_ARITHMETIC } ] RPAREN ]. WORD_VARIABLE = { SYMBOL_VARIABLE }. 23 WORD_EXPRESSION = { SYMBOL_EXPRESSION }. PARAMETER_TYPE = REAL. EXPRESSION_ARITHMETIC = NUMBER | VARIABLE | LPAREN EXPRESSION_ARITHMETIC RPAREN | EXPRESSION_ARITHMETIC OPERAND_ARITHMETIC EXPRESSION_ARITHMETIC | METHOD_CALL. VARIABLE = IDENTIFIER. METHOD_CALL = IDENTIFIER LPAREN [EXPRESSION_ARITHMETIC {COMMA EXPRESSION_ARITHMETIC}] RPAREN. OPERAND_ARITHMETIC = PLUS | MINUS | STAR | SLASH. EXPRESSION_BOOLEAN = TRUE | FALSE | LPAREN EXPRESSION_BOOLEAN RPAREN | OPERAND_BOOLEAN_UNARY EXPRESSION_BOOLEAN | EXPRESSION_BOOLEAN OPERAND_BOOLEAN_BINARY EXPRESSION_BOOLEAN | COMPERATION_ARITHMETIC. OPERAND_BOOLEAN_UNARY = NOT. OPERAND_BOOLEAN_BINARY = AND | OR. COMPARATION_ARITHMETIC = EXPRESSION_ARITHMETIC COMPERATOR_ARITHMETIC EXPRESSION_ARITHMETIC. COMPERATOR_ARITHMETIC = GT | LT | GE | LE | NE | EQ. NUMBER = DIGIT+ [ COMMA DIGIT+ ]. IDENTIFIER = LITERAL (DIGIT | LITERAL)*. DIGIT = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" LPAREN = "(". RPAREN = ")". SEMICOLON = ";". COLON = ":". COMMA = ",". ASSIGN = "=". PLUS = "+". MINUS = "-". STAR = "*". SLASH = "/". GT = ">". LT = "<". GE = ">=". LE = "<=". NE = "!=". EQ = "==". PIPE = "|". TRUE = "true". FALSE = "false". 24 CONSTANTS = "constants". SYMBOLS = "symbols". AXIOM = "axiom". SUBSTITUTION = "substitution". TABLE = "table". LIMITATION = "limitation". NONE = "none". NORMAL = "normal". UNIFORMLY = "uniformly". INTERPRETATION = "interpretation". TURTLE2D = "turtle2d". TURTLE3D = "turtle3d". REAL = "real". 25 6 Architektur 0L ist vollständig in Java implementiert, für die dreidimensionale Darstellung wurde auf das Paket Java 3D zurückgegriffen. Kernstück der Architektur ist die Klasse System, die ein Lindenmayer-System vollständig repräsentiert. Der Parser (siehe 6.1) übernimmt die Transformation eines in der Beschreibungssprache beschriebenen Lindenmayer-Systems in eine Instanz der Klasse System. 6.1 Parser Der Parser wurde mit Hilfe von antlr [2] erstellt, einem Tool zum Erzeugen von LL(k)Lexern und -Parsern aus regulären Grammatiken, die um semantische und syntaktische Prädikate erweitert werden können. Die Grammatik ist in der Datei „LindenmayerParser.g“ angegeben, antlr generiert daraus mit dem Aufruf > java antlr.Tool LindenmayerParser.g die folgenden Java-Klassen-Quellcodes: LindenmayerParser.java LindenmayerParserTokenTypes.java LindenmayerLexer.java LindenmayerLexerTokenTypes.java Der generierte Parser kann folgendermaßen genutzt werden, um eine Instanz der Klasse System zu erzeugen: LindenmayerLexer lexer = new LindenmayerLexer(Reader); LindenmayerParser parser = new LindenmayerParser(lexer); System system = parser.definition_system(); 6.2 Interpretation Grundgedanke beim Entwurf war eine Separierung der graphischen Darstellung von der Modell-Ebene. Das Ergebnis ist eine sehr lose Kopplung zwischen System und Darstellung: Die darstellenden Klassen (namentlich Turtle2D sowie Turtle3D) werden als Provider bei der interpretierenden Klasse Interpretation registriert. Ein Provider kann beliebig viele Funktionen und Variablen anbieten, die in den Statements der Interpretation genutzt werden können. Die Zuordnung wird anhand von Bezeichnern vollzogen. Aus dieser Trennung ergibt sich die Möglichkeit grundverschiedene Darstellungsformen zu implementieren, die zudem keine Kenntnis davon haben müssen, dass sie von einem Lindenmayer-System bedient werden, also auch keine entsprechende Logik implementieren müssen. Als nachteilig erweist sich hingegen, dass eine „Rückwertsauflösung“, also z.B. die Zuordnung von Graphikelementen zu Teilwörtern des interpretierten Wortes, nicht möglich ist. 26 6.3 Klassendiagramme Im folgenden werden die wichtigsten Beziehungen zwischen den Klassen angegeben. Diese Darstellung stellt keinen Anspruch auf Vollständigkeit, sondern soll vielmehr dem Verständnis der Architektur helfen. 6.3.1 System Provider {interface} + getMethods(): Methdo[] + getVariables(): Variable[] 1 System 1 1 axiom 1 1 1 1 <<implements>> MathProvider ConstantDefinition SymbolsDefinition WordConstant Substitution <<implements>> Limitation {interface} LimitationNone + getLimitationCount(depth: int) LimitationNormal Interpretation LimitationUniformly Abbildung 10 Die Klasse System 6.3.2 Substitutionen Substitution * Table * Rule leftContext 1 rightContext 1 symbol 1 condition 1 substitute 1 WordVariable WordVariable SymbolVariable ExpressionBoolean WordExpression Abbildung 11 Die Klasse Substitution 27 6.3.3 Worte und Symbole * WordConstant SymbolConstant parameters SymbolsDefinition * ExpressionArithmetic * WordVariable 1 SymbolVariable * SymbolDefinition id: String parameterCount: int parameters * Variable * WordExpression SymbolExpression parameters * ExpressionArithmetic Abbildung 12 Beziehungen zwischen Worten und Symbolen 6.3.4 Arithmetische Ausdrücke ExpressionArithmetic {abstract} 2 Addition 2 Subtraction 2 Multiplication 2 Division ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} NumberDouble value: double 1 Reference id: String * Function id: String Variable ExpressionArithmetic {abstract} Statement {abstract} Assignment 1 1 MethodCall id: String 1 * Reference ExpressionArithmetic {abstract} Method {interface} ExpressionArithmetic {abstract} Abbildung 13 Klassendiagramm arithmetischer Ausdrücke 28 6.3.5 Boolesche Ausdrücke ExpressionBoolean {abstract} + evaluateBoolean() + assignVariables(variableMap: Map) + assignMethods(methodMap: Map) True False 2 Conjunction 2 Disjunction 1 Negation 2 Equal 2 GreaterThan 2 GreaterOrEqual 2 LessThan 2 LessOrEqual 2 Unequal ExpressionBoolean {abstract} ExpressionBoolean {abstract} ExpressionBoolean {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} ExpressionArithmetic {abstract} Abbildung 14 Klassendiagramm boolescher Ausdrücke 6.3.6 Interpretation Interpretation + setProvider(p: Provider) * SymbolInterpretation 1 * SymbolVariable Statement interpretationProvider Provider {interface} <<implements>> Turtle2D Turtle3D Abbildung 15 Klassendiagramm Interpretation 29 7 Anhang 7.1 /* */ Beispiel für ein Lindenmayer-System tree3d.lms Uncomment one of the lines (a) - (i) in the constants section constants = ( r1 = 0.80; r2 = 0.80; alpha1 = 30; alpha2 = -30; phi1 = 137; phi2 = 137; w0 = 30; q = 0.50; e = 0.50; min = 0.0; // Minimal value for s to generate Leafs leafMin = 50; leafScale = 1.5; // Some calculation q1 = pow(q, e); q2 = pow(1-q, e); ); symbols = A(real,real) F(real) l(real) +(real) #(real) [] L; axiom = A(100, w0); table = ( A(s,w) | s > leafMin && s >= min = l(w)F(s) [ +(alpha1) #(phi1) A(s * r1, w * q1) ] [ +(alpha2) #(phi2) A(s * r2, w * q2) ]; A(s,w) | s <= leafMin && s >= min = l(w) LF(s)L [ +(alpha1) #(phi1) A(s * r1, w * q1) ] [ +(alpha2) #(phi2) A(s * r2, w * q2) ]; ); limitation:none; //limitation:uniformly = 3; interpretation:turtle3d = ( F(s) = ( draw(s/100); ); l(w) = ( 30 ); setLineWidth(w/300); +(r) = ( rotateX(r); ); #(r) = ( rotateY(r); ); [ = ( ); ] = ( ); L = ( ); push(); pop(); push(); rotateZ(90); setMaterial(green); setLineWidth(0.005*leafScale); draw(0.05*leafScale); rotateX(90); setLineWidth(0.025*leafScale); draw(0.005*leafScale); pop(); ); 31 8 Abbildungsverzeichnis Abbildung 1 Baum ohne Limitierung ........................................................................................ 8 Abbildung 2 Baum mit Limitierung........................................................................................... 8 Abbildung 3 Nichtdeterministische Ableitung........................................................................... 9 Abbildung 4 Programmoberfläche ........................................................................................... 11 Abbildung 5 Der Ableitungsprozess ........................................................................................ 12 Abbildung 6 Interpretation 3D ................................................................................................. 13 Abbildung 7 Interpretation 2D ................................................................................................. 13 Abbildung 8 Orientierung des 2D-Turtles ............................................................................... 18 Abbildung 9 Orientierung des 3D-Turtles ............................................................................... 19 Abbildung 10 Die Klasse System............................................................................................. 27 Abbildung 11 Die Klasse Substitution ..................................................................................... 27 Abbildung 12 Beziehungen zwischen Worten und Symbolen................................................. 28 Abbildung 13 Klassendiagramm arithmetischer Ausdrücke.................................................... 28 Abbildung 14 Klassendiagramm boolescher Ausdrücke ......................................................... 29 Abbildung 15 Klassendiagramm Interpretation ....................................................................... 29 32 9 Literaturverzeichnis [1] [2] [3] [4] [5] [6] [7] [8] [9] F. Böhmer: Internetseite zu 0L http://www.lindenmayer.innercitylife.net. T. Parr: Internetseite zu antlr http://www.antlr.org. P. Prusinkiewicz, Jim Hanan, Mark Hammel, Radomír Mêch: L-systems: from the theory to visual models of plants. P. Prusinkiewicz, A. Lindenmayer: The Algorithmic Beauty of Plants. Springer, Berlin 1990. G. Rozenberg, A. Salomaa: The Mathematical Theory of L Systems. Academic Press, New York 1980. Sun Microsystems: Sun Java Internetseite http://www.java.sun.com. D. Wätjen: Automatentheorie und Formale Sprachen. Vorlesungsskript (1999), 196-252. D. Wätjen: k-Limited 0L-Systems and Languages. J. Inf. Process. Cybernet. EIK 24 (1988), 267-285. D. Wätjen: On k-uniformly-limited T0L Systems and Languages. J. Inf. Process. Cybernet. EIK 26 (1990), 229-238. 33