Struktur-Funktions-Modelle von Pflanzen - Sommersemester 2015 - Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik 5. Vorlesung: 11. 6. 2015 letztes Mal: • einfache Verzweigungsmuster, modelliert mit L-Systemen • weitere L-System-Beispiele • Verwendung von imperativem Code in XL-Programmen als nächstes: • Verwendung von Schleifen und Arrays bei Verzweigungs-Konstruktionen • konditionale Regelanwendung (Beispiele) • Einbau von Texturen in Pflanzenmodelle • Anlegen eines Projekts in GroIMP • stochastische L-Systeme • kontextsensitive L-Systeme • ein neuer Regeltyp: Interpretationsregeln Beispiel für eine for-Schleife für Seitenzweige: sm09_b22.rgg protected void init() [ Axiom ==> F(10); ] public void seitenzweig() [ F(x) ==> F(x) L(x) for (int i=1; i<=5; i++) ( [ MRel(0.1*i+0.2) RU((-1**i)*30) F(x*0.2) ] ); ] Beispiel für Verwendung von Arrays zur Steuerung von Längen und Winkeln: sm09_b20.rgg // ... const float[] laenge = { 1, 1, 0.5, 0.2}; const float[] winkel = {40, 50, 80 , 100 }; public void run1() [ a:A, (a[ordnung] < 4) ==> F(laenge[a[ordnung]]) [ RU( winkel[a[ordnung]]) RH(90) A(a[ordnung]+1) ] [ RU(-winkel[a[ordnung]]) RH(90) A(a[ordnung]+1) ]; ] Konditionale L-System-Regeln in XL linke_Regelseite, ( Bedingung ) ==> rechte_Regelseite Beispiele: sm09_b11.rgg Bedingungen für Regelanwendungen sm09_b12.rgg Bedingungen für Regelanwendungen (2. Variante) sm09_b13.rgg Verknüpfung zweier Bedingungen Farben setzen in XL (Zusammenfassung) Texturen Texturen sind 2-dimensionale Muster, die anstelle von Farben auf Oberflächen aufgetragen werden, um einen realistischeren Eindruck der Beschaffenheit von Objektoberflächen zu erhalten. Quellen für Texturen: Fotos, Scans von Objekten, Bilddatenbanken im Internet, künstlich erzeugte Muster... Beispiel mit Baum-Foto als Textur für das Rechteck: zu beachten bei Anlegen des Projekts: Editor-Datei nach der Auswahl der Bilddatei neu speichern / kompilieren - texturierte Objekte werden nun mit Textur dargestellt Speichern des gesamten Projekts: File Save, Namen des Projekts eingeben (muss nicht mit Namen der RGG-Programmdatei übereinstimmen). Bilddatei wird mitgespeichert. Projektdatei hat Namensendung .gsz (lesbar mit Datenkompressionsprogrammen wie z.B. WinZIP) Beispiel: sm09_b10.gsz Verwendung einer Blatt-Textur Stochastische L-Systeme Verwendung von Pseudozufallszahlen Beispiel: deterministisch stochastisch Axiom ==> L(100) D(5) A; Axiom ==> L(100) D(5) A; A ==> F0 LMul(0.7) DMul(0.7) [ RU(50) A ] [ RU(-10) A ]; A ==> F0 LMul(0.7) DMul(0.7) if (probability(0.5)) ( [ RU(50) A ] [ RU(-10) A ] ) else ( [ RU(-50) A ] [ RU(10) A ] ); Beispiel: Fichtenmodell in 3D mit L-System erzeugt XL-Funktionen für Pseudozufallszahlen: Man teste das Beispiel sm09_b19.rgg Stochastisches L-System Erzeugung einer Zufallsverteilung in der Ebene: Axiom ==> D(0.5) for ((1:300)) ( [ Translate(random(0, 100), random(0, 100), 0) F(random(5, 30)) ] ); Ansicht von oben schräg von der Seite Man teste die Beispiele sm09_b23.rgg Verbreitungsmodell (1 Art) sm09_b24.rgg Verbreitungsmodell (2 Arten) In diesen Beispielen wird die Konkurrenz noch nicht berücksichtigt. Es wird gezeigt, wie Populationsstärken in Charts während der Laufzeit der Simulation ausgeplottet werden können. 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); ] Hausaufgabe zum nächsten Mal: • Bearbeiten Sie im ILIAS-Lernmodul „Einführung in GroIMP“ (verfügbar über StudIP) die Lektionen 5 – 12.