struktur-funktions-modelle von pflanzen - sommersemester 2011 - winfried kurth universität...
Post on 05-Apr-2015
108 Views
Preview:
TRANSCRIPT
Struktur-Funktions-Modelle von Pflanzen- Sommersemester 2011 -
Winfried Kurth
Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik
8. Vorlesung: 23. 6. 2011
zuletzt:
• Ersetzungsregeln in relationalen Wachstumsgrammatiken
• zwei Typen von Ersetzungsregeln: L-System- und SPO-Regeln
• Aktualisierungsregeln
• Die Sprache XL: Überblick über wichtige Eigenschaften
als nächstes:
• Darstellung von Graphen in XL
• Kantentypen (Relationen)
• transitive Hülle
• Graphansicht in GroIMP, Graph-Layouts
• Queries im Graphen
• Beispiel: ein Fichtenmodell
Darstellung von Graphen in XL
● Knotentypen müssen mit „module“ deklariert werden
● Knoten können alle Java-Objekte sein. Bei eigenen module-Deklarationen können auch Methoden (Funktionen) und zusätzliche Variablen mitdeklariert werden, wie in Java
● Notation für Knoten in einem Graphen: Knotentyp, optional davor: bezeichner: Beispiele: A, Meristem(t), b:Bud
● Notation für Kanten in einem Graphen:
-Kantenbezeichner->, <-Kantenbezeichner-
● Spezielle Kantentypen: Nachfolgerkante: -successor->, > oder (Leerstelle) Verzweigungskante: -branch->, +> oder [ Verfeinerungskante: />
Notationen für spezielle Kantentypen
> Nachfolgerkante vorwärts
< Nachfolgerkante rückwärts
--- Nachfolgerkante vorwärts oder rückwärts
+> Verzweigungskante vorwärts
<+ Verzweigungskante rückwärts
-+- Verzweigungskante vorwärts oder rückwärts
/> Verfeinerungskante vorwärts
</ Verfeinerungskante rückwärts
--> beliebige Kante vorwärts
<-- beliebige Kante rückwärts
-- beliebige Kante vorwärts oder rückwärts(vgl. Kniemeyer 2008, S. 150 und 403)
selbstdefinierte Kantentypen
const int xxx = EDGE_0; // oder EDGE_1, ..., EDGE_14
...
Verwendung im Graphen: -xxx->, <-xxx-, -xxx-
Notation von Graphen in XL
Beispiel:
wird im Programmcode dargestellt als
(die Darstellung ist nicht eindeutig!)
( >: Nachfolgerkante, +: Verzweigungskante)
abgeleitete Relationen
Relation zwischen Knoten, die durch mehrere Kantendesselben Typs (hintereinander) verbunden sind:
„transitive Hülle“ der ursprünglichen Relation (Kante)
Bezeichnungsweise für die transitive Hülle in XL:
(-kantentyp->)+
reflexiv-transitive Hülle (auch „Knoten steht in Relation zu sich selbst“ zugelassen):
(-kantentyp->)*
z.B. für die Nachfolgerrelation: (>)*
gemeinsame transitive Hülle der speziellen Kantentypen„Nachfolger“ und „Verzweigung“, in umgekehrter Richtung:
-ancestor->Interpretation: diese Relation besteht zu allen „Vorgängerknoten“ in einem Baum entlang des Pfades zur Wurzel.
Nächste Nachfolger eines bestimmten Knotentyps:
-minDescendants-> (Knoten anderen Typs werden übersprungen)
Der aktuelle Graph
GroIMP führt immer einen Graphen mit, der die gesamte aktuelle Strukturinformation beinhaltet. Dieser wird durch Anwendung der Regeln umgeformt.
Achtung: Nicht alle Knoten des Graphen werden in der 3D-Ansicht durch sichtbare Objekte dargestellt!
- F0, F(x), Box, Sphere: ja
- RU(30), A, B: normalerweise nicht (wenn nicht mit „extends“ aus sichtbaren Objekten abgeleitet)
Der Graph kann in der 2D-Graphansicht komplett dargestellt werden (in GroIMP: Panels - 2D - Graph).
Laden Sie eine Beispiel-rgg-Datei in GroIMP und führen Sie einige Schritte aus (verwenden Sie keine zu komplexe Struktur).
Öffnen Sie die 2D-Graphansicht, verankern Sie mit der Maus das Fenster in der GroIMP-Oberfläche und testen Sie verschiedene Layouts (Layout - Edit):
GeneralPurposeTreeSugiyamaSquareCircleRandomSimpleEdgeBasedFruchterman
Verfolgen Sie die Veränderung desGraphen, wenn Sie die Regelnanwenden (redraw anklicken)!
was ist von der in XL erzeugten Graph-Struktur sichtbar(in der 3D-Ansicht) ?
alle Geometrieknoten, die von der Wurzel (Zeichen: ^) des Graphen über genau einen Pfad, der nur aus "successor"- und "branch"-Kanten besteht, erreichbar sind.
Erzwingen, dass ein Objekt auf jeden Fall sichtbar ist:
==>> ^ Objekt
Anfragen (queries) in den erzeugten Graphen
Möglichkeit der Verbindung von Struktur und Funktion
Beispiel: suche alle Blätter, die Nachfolger des Knotens c sind, und summiere deren Fläche
query
Anfragen (queries) in den erzeugten Graphen
Möglichkeit der Verbindung von Struktur und Funktion
Beispiel: suche alle Blätter, die Nachfolger des Knotens c sind, und summiere deren Fläche
transitive Hüllenbildung
Aggregationsoperator
query
Anfragen (queries) in den erzeugten Graphen
Möglichkeit der Verbindung von Struktur und Funktion
Beispiel: suche alle Blätter, die Nachfolger des Knotens c sind, und summiere deren Fläche
transitive Hüllenbildung
Aggregationsoperator
Ergebnis kann übergeben werden an imperative Berechnung
query
Query in einem Pflanzen- / Tier-Modell:
p:Plant,
(* a:Animal, (distance(a,p) < p[radius]) *)
sucht alle Tiere innerhalb des Radius von p
Query-Syntax:
Umgeben wird eine Query mit (* *)
Die Elemente werden in ihrer erwarteten Reihenfolge angegeben, z.B.: (* A A B *) sucht nach einen Subgraphen, welcher eine Folge von Knoten der Typen A A B, verbunden durch Nachfolgerkanten, enthält.
Testen Sie die Beispiele sm09_b28.rgg, sm09_b29.rgg,sm09_b30.rgg, sm09_b31.rgg
Ein Fichtenmodell in XL
/* Fichtenmodell sm09_fichte.rgg, W.K. 11. 6. 2009 */
module T; /* terminale Knospe */module M1; /* Seitenzweigknospe 1. Ordn., mediale Position */module S1; /* Seitenzweigknospe 1. Ordn., subapikale Pos. */module M2; /* Seitenzweigknospe 2. Ordn., mediale Pos. */module S2;module M3;module S3;module GU(float incd, int age) extends F0; /* growth unit */module BA(int age, super.angle) extends RL(angle);module GA(int age, super.angle) extends RL(angle);module HA(int age, super.angle) extends RL(angle);
const int ang = 45;const int x3 = 50;const int[] a = { 0, 15, 25, 32, 37, 40 };const int[] gg = { 0, 0, 4 };const int[] hh = { 0, 0, 2, 4, 8 };int n, k;const float[] prob_n = {0.1, 0.4, 0.3, 0.2};const int[] n_subap = {5, 6, 7, 8};
protected void init() [Axiom ==> P(2) D(1) L(100) T;] public void grow()[x:T ==> Nl(80*TurtleState.length(x)) GU(2.2, 0) RH(random(0, 360)) { k = 0; } for ((1:3)) /* 3 mediale Seitenäste 1. Ordnung */
( [ MRel(random(0.2, 0.85)) RH(k*120+normal(0, 5.5)) { k++; } RL(x3+normal(0, 2.2)) BA(0, 0) LMul(0.4) M1 ] )
RH(random(0, 360)) { n = n_subap[distribution(prob_n)]; k = 0; } for ((1:n)) /* n subapikale Seitenäste 1. Ordnung */ ( [ MRel(random(0.85, 1)) RH(k*360/n+normal(0, 3.1)) { k++; } RL(x3+normal(0, 2.2)) BA(0, 0) LMul(0.65) S1 ] ) T;
x:S1 ==> Nl(80*TurtleState.length(x)) GU(1.3, 0) [ MRel(random(0.85, 1)) RH(15) RU(ang+normal(0, 2.2)) AdjustLU LMul(0.7) S2 ]
[ MRel(random(0.85, 1)) RH(-15) RU(-ang+normal(0, 2.2)) AdjustLU LMul(0.7) S2 ] GA(0, 0) S1;
x:M1 ==> Nl(80*TurtleState.length(x)) GU(0.8, 0) [ MRel(random(0.85, 1)) RH(15)
RU(ang+normal(0, 2.2)) AdjustLU LMul(0.7) M2 ] [ MRel(random(0.85, 1)) RH(-15) RU(-ang+normal(0, 2.2)) AdjustLU LMul(0.7) M2 ] HA(0, 0) M1;
x:S2 ==> Nl(80*TurtleState.length(x)) GU(1.3, 0) [ MRel(random(0.85, 1)) RH(10)
RU(ang) AdjustLU LMul(0.7) S3 ] [ MRel(random(0.85, 1)) RH(-10) RU(-ang) AdjustLU LMul(0.7) S3 ] S2;
x:M2 ==> Nl(80*TurtleState.length(x)) GU(0.8, 0) [ MRel(random(0.85, 1)) RH(10) RU(ang) AdjustLU LMul(0.7) M3 ] [ MRel(random(0.85, 1)) RH(-10)
RU(-ang) AdjustLU LMul(0.7) M3 ] M2;
x:S3 ==> Nl(80*TurtleState.length(x)) GU(1.3, 0);x:M3 ==> Nl(80*TurtleState.length(x)) GU(0.8, 0);GU(incd, t) ==> DlAdd(incd*(t+1)) GU(incd, t+1);DlAdd(arg) ==> ;
BA(age, angle) ==> BA(age+1, a[age<5 ? age+1 : 5]);GA(age, angle) ==> GA(age+1, gg[age<2 ? age+1 : 2]);HA(age, angle) ==> HA(age+1, hh[age<4 ? age+1 : 4]);]
darin vorkommende neue Knotentypen und Befehle:siehe folgende Seiten
Funktion TurtleState.length(x) (für einen Knoten x):
- liefert die Schrittweite der Turtle am Knoten x
Turtle-Kommando (Knoten) AdjustLU :
- dreht die Turtle so um die H-Achse, dass der U-Vektor möglichst nach oben zeigt
Turtle-Kommando (Knoten) N :
- steuert Blattmasse (analog zu L und D)
Zufallszahlenfunktionen:
- normal(, ): liefert normalverteilte Zufallszahlen mit Mittelwert und Standardabweichung
- distribution(v) mit Vektor v : liefert ganzzahlige Zufallszahlen mit Wahrscheinlichkeit v[0] für 0, v[1] für 1, ...
dreistelliger Operator für Fallunterscheidungen:
Bedingung ? Ausdruck1 : Ausdruck2
- liefert den Wert von Ausdruck1, falls die Bedingung erfüllt ist, sonst den Wert von Ausdruck2.
x = Bedingung ? Ausdruck1 : Ausdruck2 ist gleichwertig zu
if (Bedingung)
x = Ausdruck1;
else
x = Ausdruck2;
(diesen Operator gibt es auch in C, C++ und Java.)
Hausaufgabe:
Analysieren Sie den XL-Code des Modells sm09_fichte.rgg.
Testen Sie das Modell mit GroIMP, und analysieren Sie den Code noch einmal.
Notieren Sie alles, was Ihnen unklar ist.
Versuchen Sie, folgende Fragen zu beantworten:
- wie lässt sich das Dickenwachstum verstärken
- für alle Wachstumseinheiten (growth units, GU)?
- nur für den Stamm?
- wie lässt sich (durch Veränderung des Längenwachstums) eine schlankere Kronenform erreichen?
- wie lässt sich die Zahl der Haupt-Seitenäste vermindern?
top related