Struktur-Funktions-Modelle von Pflanzen - Sommersemester 2014 - Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik 6. Vorlesung: 19. 6. 2014 zuletzt: • L-System-Beispiele • Einbau von Texturen in Pflanzenmodelle • Anlegen eines Projekts in GroIMP • stochastische L-Systeme • (Aufgabe:) Gänseblümchen-, Farnmodell als nächstes: • kontextsensitive L-Systeme • ein neuer Regeltyp: Interpretationsregeln • der Graph als grundlegende Datenstruktur: Definition • Eigenschaften von Graphen • Graph-Ersetzungsregeln Kontextsensitive L-Systeme Abfrage eines Kontexts, der vorhanden sein muss, damit eine Regel anwendbar ist in XL: Angabe des Kontexts in (* .... *) Kontextsensitive L-Systeme Beispiel für Verwendung von linkem Kontext: weiteres Beispiel: sm09_b14.rgg linker Kontext Kontextsensitive L-Systeme Beispiel für Verwendung von rechtem Kontext: weiteres Beispiel: sm09_b15.rgg rechter Kontext rechter Kontext; Einbau in ein Modell zur signalgesteuerten Auslösung des Austriebs von Seitentrieben module A(int age); module B(super.length, super.color) extends F(length, 3, color); Axiom ==> A(0); A(t), (t < 5) ==> B(10, 2) A(t+1); // 2 = grün A(t), (t == 5) ==> B(10, 4); // 4 = rot B(s, 2) (* B(r, 4) *) ==> B(s, 4); B(s, 4) ==> B(s, 3) [ RH(random(0, 360)) RU(30) F(30, 1, 14) ]; // 3 = blau Einschub: Interpretationsregeln Einbau einer weiteren Regelanwendung unmittelbar vor der grafischen Interpretation (ohne Wirkung auf die nächste Generation) InterpretationsregelAnwendung Turtle-Interpretation gewöhnliche geometrische Interpretation (ohne Interpretationsregeln): mit Verwendung von Interpretationsregeln: weiteres Beispiel: module module module module module MainBud(int x) extends Sphere(3) {{setShader(GREEN);}}; LBud extends Sphere(2) {{setShader(RED);}}; LMeris; AMeris; Flower; const float d = 30; const float crit_dist = 21; protected void init() [ Axiom ==> MainBud(10); ] public void run() { [ MainBud(x) ==> F(20, 2, 15) if (x > 0) ( RH(180) [ LMeris ] MainBud(x-1) ) else ( AMeris ); LMeris ==> RU(random(50, 70)) F(random(15, 18), 2, 14) LBud; LBud ==> RL(90) [ Flower ]; AMeris ==> Scale(1.5) RL(90) Flower; /* Flower: hier nur ein Symbol */ ] applyInterpretation(); /* Aufruf der Interpretationsregelausfuehrung (im imperativen Teil { ... } !) */ } protected void interpret() /* Block mit Interpretationsregeln */ [ Flower ==> RH(30) for ((1:5)) ( RH(72) [ RL(80) F(8, 1, 9) ] ); ] weiteres Beispiel: public void run() { [ Axiom ==> A; A ==> Scale(0.3333) for (int i:(-1:1)) for (int j:(-1:1)) if ((i+1)*(j+1) != 1) ( [ Translate(i, j, 0) A ] ); ] applyInterpretation(); } public void interpret() [ A ==> Box; ] erzeugt den sogenannten „Menger-Schwamm“ (ein Fraktal) public void run() { [ Axiom ==> A; A ==> Scale(0.3333) for (int i:(-1:1)) for (int j:(-1:1)) if ((i+1)*(j+1) != 1) ( [ Translate(i, j, 0) A ] ); ] applyInterpretation(); } (a) (b) public void interpret() [ A ==> Box; ] A ==> Sphere(0.5); (c) A ==> Box(0.1, 0.5, 0.1) Translate(0.1, 0.25, 0) Sphere(0.2); was wird durch dieses Beispiel erzeugt? public void run() { [ Axiom ==> [ A(0, 0.5) D(0.7) F(60) ] A(0, 6) F(100); A(t, speed) ==> A(t+1, speed); ] applyInterpretation(); } public void interpret() [ A(t, speed) ==> RU(speed*t); ] Der Schritt zu Graph-Grammatiken Nachteil von L-Systemen: • in L-Systemen mit Verzweigungen (über Turtle-Kommandos) nur 2 mögliche Relationen zwischen Objekten: "direkter Nachfolger" und "Verzweigung" Erweiterungen: • Zulassen weiterer Relationstypen (beliebig wählbar) • Zulassen von Zyklen Graph-Grammatik Ein Graph: eine Art, Daten zu organisieren Def.: eine Menge von Knoten, (teilweise) verbunden durch (gerichtete) Kanten (Relationen). T T I I T I Kantentypen (Relationen): Knoten T I (T = Trieb, I = Internodium) Nachfolgerbeziehung Verfeinerungsbeziehung Eine Zeichenkette (string): ein sehr einfacher Graph Eine Zeichenkette kann man als 1dimensionalen Graphen mit nur einem Kantentyp auffassen Nachfolger-Kanten (successor relation) A B A C A A B A C Finden Sie so eine Struktur irgendwo im realen Leben wieder? R S S S B B B B B B B S S S B B B B B B B B B S B B S S S S S B B B B B B B B B S vielleicht jetzt? Bu d Bu d Shoot Bu d Bu d Bu d Bu d Shoot Shoot Bu d Shoot Bu d Bu d Bud Bu d Bud Shoot Bud Bu d Bu d Bud Shoot Shoot Bu d Shoot Shoot Bu d Bu d Bu d Shoot Bu d Bu d Shoot Bu d Bu d Bu d Shoot Root Bu d Shoot Bu d es handelt sich um einen Baum. Bäume sind spezielle Graphen. 4 3 Knotentypen Wurzelkompartiment Jahrestriebe Knospen 3 2 2 Kantentypen Nachfolgerrelation (selbe Achse) Verzweigungsrelation (neue Achse) 1 zugrundeliegendes Teilgebiet der Mathematik: Topologie zwei isomorphe Graphen: dichotom Fischgräten nun werden die Graphen zeitlich veränderlich gemacht! Graph-Grammatik (Beispiel) Regel: Graph-Grammatik (Beispiel) Regel: Anwendung: hier nicht anwendbar! (falscher Kantentyp) Eine relationale Wachstumsgrammatik (RGG)* (spezieller Typ von Graph-Grammatik) enthält: ein Alphabet – die Definition aller erlaubten • Knotentypen • Kantentypen (Typen von Relationen) das Axiom – ein initialer Graph, der aus Elementen des Alphabets zusammengesetzt ist eine Menge von Graphersetzungsregeln. * relational growth grammar Eine relationale Wachstumsgrammatik enthält: ein Alphabet – die Definition aller erlaubten Root Shoot • Knotentypen • Typen von Relationen Nachfolger Bu d Verzweigung Bu Root Shoot das Axiom d – ein initialer Graph, der aus den Elementen des Alphabets zusammengesetzt ist eine Menge von Graphersetzungsregeln Was sind nun diese Graphersetzungsregeln (RGG-Regeln) ? und wie wendet man sie an? Graphersetzungsregeln sind Regeln für die Transformation eines Graphen (Teilgraphen) in einen anderen Graphen. eine Regel besteht im wesentlichen aus: linker Regelseite ==> rechter Regelseite Wie eine RGG-Regel angewandt wird jede linke Regelseite beschreibt einen Teilgraphen (ein Muster aus Knoten und Kanten, das im Gesamtgraphen gesucht wird), welcher ersetzt wird bei der Regelanwendung. jede rechte Regelseite definiert einen neuen Teilgraphen, der als Ersatz für den entfernten Teilgraphen eingefügt wird. einfaches Beispiel mit Zeichenkette Jedes Vorkommen des in der linken Regelseite definierten Teilgraphen wird ersetzt! A B C A C A D B C D wird ersetzt durch C 2 Regelanwendungen im selben Zeitschritt. D eine vollständige RGG-Regel kann 5 Teile enthalten: (* Kontext *), Linke Regelseite, ( Bedingung ) ==> Rechte Regelseite { imperativer XL-Code } Kontext-Beispiel (* Kontext *), Linke Regelseite, (Bedingung) ==> Rechte Regelseite { imperativer XL-Code } Beispiel: A B C A C A D B C A C (* B *) wird ersetzt durch D Bedingungs-Beispiel (* Kontext *), Linke Regelseite, ( Bedingung ) ==> Rechte Regelseite { imperativer XL-Code } Beispiel: A B C A a:A A C ( a[length] > 10 ) wird ersetzt durch B D C A C B C A C D 2 mögliche Ergebnisse, abhängig vom aktuellen Längenparameter des A-Knotens RELATIONALE WACHSTUMSGRAMMATIKEN (RGG: Relational Growth Grammars, parallele Graph-Gramm.) Zusammenfassung: Aufbau einer Regel einer RGG imperativer Code Hausaufgabe: 1. Bearbeiten Sie im ILIAS-Lernmodul „Einführung in GroIMP“ (verfügbar über StudIP) die Lektionen 13 - 16 und 20 - 22. 2. Lesen Sie Chapter 1, Section 1.8 im Buch „The Algorithmic Beauty of Plants“ von P. Prusinkiewicz und A. Lindenmayer (= S. 30-35). (Beachten Sie die abweichende Notation für kontextsensitive Regeln.)