180 likes | 272 Views
Struktur-Funktions-Modelle von Pflanzen - Sommersemester 2014 - Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik 9. Vorlesung: 10. 7. 2014. zuletzt: abgeleitete Relationen (z.B. transitive Hüllen) Graphansicht in GroIMP, Graph-Layouts
E N D
Struktur-Funktions-Modelle von Pflanzen - Sommersemester 2014 - Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik 9. Vorlesung: 10. 7. 2014
zuletzt: • abgeleitete Relationen (z.B. transitive Hüllen) • Graphansicht in GroIMP, Graph-Layouts • Die Sprache XL: Übersicht • Queries im Graphen • Die Software GroIMP: Übersicht • Beispiel für ein dynamisches Strukturmodell: Fichte
als nächstes: • Fichtenmodell (Besprechung der Hausaufgaben) • Berechnung von Beschattung (1. Ansatz) • sequenzielle Regelanwendung • sekundäres Dickenwachstum, Pipe-Modell • Instanzierungsregeln
Fichtenmodell in XL (vgl. letzte Vorlesung) /* 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]); ]
- was ist unklar? - 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?
Modellierung von Licht / Beschattung erster Modellansatz (stark vereinfachend): Beschattung eines Objekts liegt dann vor, wenn sich in einem gedachten Kegel mit Spitze im Objekt, geöffnet nach oben (z-Richtung), noch andere Objekte befinden. Beispiel: sm09_b42.rgg Lichtkonkurrenz dreier 2-dimensionaler Modellpflanzen
module Segment(int t, int ord) extends F0; module TBud(int t) extends F(1, 1, 1); module LBud extends F(0.5, 0.5, 1); Vector3d z = new Vector3d(0, 0, 1); protected void init() [ Axiom ==> P(2) D(5) V(-0.15) [ TBud(-4) ] RU(90) M(600) RU(-90) [ TBud(0) ] RU(-90) M(1200) RU(90) [ TBud(-8) ]; ] public void run() [ TBud(t), (t < 0) ==> TBud(t+1); x:TBud(t), (t >= 0 && empty( (* s:Segment, (s in cone(x, z, 45)) *) ) ) ==> L(random(80, 120)) Segment(0, 0) [ MRel(random(0.5, 0.9)) RU(60) LBud ] [ MRel(random(0.5, 0.9)) RU(-60) LBud ] TBud(t+1); y:LBud, (empty( (* s:Segment, (s in cone(y, z, 45)) *) ) ) ==> L(random(60, 90) Segment(0, 1) RV0 LBud; Segment(t, o), (t < 8) ==> Segment(t+1, o); Segment(t, o), (t >= 8 && o == 1) ==>> ; /* Entfernen des ganzen Astes */ ]
Ableitungsmodi in XL standardmäßig voreingestellt: parallele Regelanwendung (wie bei L-Systemen) Umschalten auf sequenzielle Anwendung (in jedem Schritt wird dann höchstens eine Regel angewandt): setDerivationMode(SEQUENTIAL_MODE) Rückschaltung auf parallel: setDerivationMode(PARALLEL_MODE) testen Sie das Beispiel sm09_b32.rgg
Modellierung des Dickenwachstums in Pflanzen • häufig verwendete Ansätze: • Regression Durchmesser ~ Länge für neue Wachstumseinh. • Zuwachs dann von Alter, Verzweigungsordnung etc. • abhängig • verwende z.B. Regel mit jährlichem festem Wachstum • Shoot(l, d) ==> Shoot(l, d+delta_d); • Interpretationsregel für Shoot: Shoot(d) ==> F(l, d); • oder: “pipe-model“-Annahme
“pipe model“ (SHINOZAKI et al. 1964) : Parallel geschaltete “unit pipes“ Querschnitt ~ Blattmasse ~ Feinwurzelmasse
Folgerung : „Leonardo-Regel“ (da Vinci, um 1500) di In jedem Verzweigungsknoten gilt d2 = di2 (Invarianz der Querschnittsfläche) d
A1 A = A1 + A2 d 2 = d12 + d22 A A2 Realisierung in einem XL-Modell: siehe Beispiele sm09_b33.rgg, sm09_b34.rgg dort wird zunächst das Längen- und Strukturwachstum simuliert, dann in getrennten Schritten das Dickenwachstum, berechnet von oben nach unten (es ist auch eine – realistischere – Kombination möglich)
Ein weiterer Regeltyp in XL: • Instanzierungsregeln • Zweck: Ersetzung einzelner Module durch kompliziertere Strukturen, nur für die Darstellung • (wie bei Interpretationsregeln) • aber: es wird weniger abgespeichert (Einsparen von • Speicherplatz) • anders als bei Interpretationsregeln dürfen keine Turtle- • Befehle mit Wirkung auf andere Knoten verwendet werden • weitere Möglichkeit: „Replikator-Knoten“ zum Kopieren und Neuplatzieren von ganzen Strukturen
Instanzierungsregeln: Syntax kein neuer Regelpfeil Angabe der Instanzierungsregel direkt in der Moduldeklaration module A ==> B C D; ersetzt (instanziert) überall A durch B C D Beispiel sm09_b43.rgg
const int multiply = EDGE_0; /* selbstdefinierter Kantentyp */ module Tree ==> F(20, 1) [ M(-8) RU(45) F(6, 0.8) Sphere(1) ] [ M(-5) RU(-45) F(4, 0.6) Sphere(1) ] Sphere(2); module Replicator ==> [ getFirst(multiply) ] Translate(10, 0, 0) [ getFirst(multiply) ]; public void run1() [ Axiom ==> F(2, 6) P(10) Tree; ] public void run2() [ Axiom ==> F(2, 6) P(10) Replicator -multiply-> Tree; ] Tree wird mit der roten Struktur instanziert es wird eingefügt, was an der „multiply“-Kante hängt
weiteres Beispiel einer Anwendung eines Multiplikator-Knotens mit Instanzierungsregel: (Henke 2006)