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.

Projekte in GroIMP, stochastische und kontextsensitive L