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.)