Upload
amalie-stueve
View
104
Download
0
Embed Size (px)
Citation preview
Struktur-Funktions-Modelle von Pflanzen- Sommersemester 2009 -
Winfried Kurth
Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik
4. Vorlesung: 7. 5. 2009
letztes Mal: • einfache L-Systeme (Zeichenkettenersetzungssysteme)
• ihre Ausführung mit GroIMP
• einfache Verzweigungsmuster, modelliert mit L-Systemen
als nächstes:
• weitere L-System-Beispiele
• Verwendung von imperativem Code in XL-Programmen
• konditionale Regelanwendung
• stochastische L-Systeme
• kontextsensitive L-Systeme
• Einbau von Texturen in Pflanzenmodelle
• Anlegen eines Projekts in GroIMP
welche Struktur liefert
Axiom ==> F(10) A ;
A ==> [ RU(-60) F(6) RH(180) A Sphere(3) ] [ RU(40) F(10) RH(180) A Sphere(3) ];
Sphere ==> Z; ?
(F(n) liefert Linie der vorgegebenen Länge n,Sphere(n) eine Kugel mit Radius n)
Welche Struktur wird von folgendem parametrischem L-System erzeugt?
Axiom ==> [ RU(90) M(1) RU(90) A(1) ] A(1);
A(n) ==> F(n) RU(90) A(n+1);
Variante:
in der zweiten Regel "RU(90)" etwa durch "RU(92)" ersetzen.
Testen Sie die Beispiele
sm09_b04.rgg Zwei Regelblöcke
sm09_b05.rgg wechselständiges Wachstum
sm09_b06.rgg gegenständiges Wachstum
sm09_b07.rgg Farbgebung für einzelne Elementedurch imperativen Code
sm09_b08.rgg Verwendung eigener Module
sm09_b21.rgg Seitenzweig-Positionierung
Verwendung von imperativem Code in XL-Programmen
Befehle wie Zuweisungen von Werten zu Variablen, Additionen, Funktionsausführungen, Ausgabe (Druckbefehle) usw. werden mit der gleichen Schreibweise wie in der Programmiersprache Java angegeben und in geschweifte Klammern { ... } eingeschlossen.
Beispiele:
int i; // Deklaration einer ganzzahligen Variablen mit Namen i
float a = 0.0; // Deklaration u. Initialisierung einer Gleitkomma-Var.
int[] x = new int[20]; // Deklaration eines Arrays (Datenfeldes) // der Länge 20; Zugriff: x[0], ..., x[19]float[] y = { 0.1, 0.2, 0.7, -1.4 }; // Deklaration und Initialisierung eines Arrays
i = 25; // Zuweisung
Verwendung von imperativem Code (Fortsetzung)
i++; // i wird um 1 erhöht
i--; // i wird um 1 vermindert
i += 5; // i wird um 5 erhöht
i -= 5; // i wird um 5 vermindert
i *= 2; // i wird verdoppelt
i /= 3; // i wird gedrittelt
n = m % a; // n wird der Rest von m bei ganzzahl. Division durch a zugew.
x = Math.sqrt(2); // x wird die Quadratwurzel aus 2 zugewiesen
if (x != 0) { y = 1/x; } // bedingte Zuweisung von 1/x an y
while (i <= 10) { i++; } // Schleife: solange i 10 ist, // wird i um 1 erhöht
for (i = 0; i < 100; i++) { x[i] = 2*i; } // imperative // for-Schleifeif (i == 0) { ... } // Test auf Gleichheit ( „=“ wäre Zuweisung!)
Datentypen:
int ganze Zahlen
float Gleitkommazahlen
double Gleitkommazahlen, doppelte Präzision
char Zeichen (characters)
void leerer Typ (für Funktionen, die nichts zurückgeben)
mathematische Konstanten:
Math.PI
Math.E e
logische Operatoren:
&& und
|| oder
! nicht
mathematische Funktionen:
Math.abs Absolutbetrag Math.sqrt Quadratwurzel
Math.acos Arcuscosinus Math.tan Tangens
Math.asin Arcussinus Math.toDegrees
Math.atan Arcustangens Math.toRadians
Math.cos Cosinus Umrechung Gradmaß
Math.exp Exponentialfunktion ex Bogenmaß
Math.log natürlicher Logarithmus
Math.max Maximum zweier Zahlen
Math.min Minimum zweier Zahlen
Math.round Rundungsfunktion
Math.sin Sinus
sm_progbsp01.rgg: schreibt die Zahlen von 1 bis 10 auf die GroIMP-Konsole
protected void init()
{
int i;
for (i=1; i<= 10; i++)
println(i);
println("Ende.");
}
sm_progbsp02.rgg: schreibt ungerade Quadratzahlen
protected void init()
{
int a, b;
for (a = 1; a <= 10; a++)
{
b = a*a;
if (b % 2 != 0) println(b);
}
println("Ende.");
}
sm_progbsp03.rgg: schreibt die Fibonacci-Zahlen
protected void init() { int i; int[] fibo = new int[20]; /* Array-Deklaration */ fibo[0] = fibo[1] = 1; for (i=2; i <= 19; i++) fibo[i] = fibo[i-1] + fibo[i-2]; for (i=0; i <= 19; i++) println(fibo[i]); println("Ende."); }
sm_progbsp04.rgg: Verwendung einer Funktion
/* ein einfaches imperatives Programm: Eine selbstgeschriebene Funktion berechnet x2 + 1; diese wird fuer x von 0 bis 1 in 0.1-Schritten ausgewertet. Man achte auf Rundungsfehler und auf die richtige Obergrenze fuer x. */
public float funktion(float x) { return x*x + 1; } protected void init() { float a = 0.0; /* Gleitkommazahl */ while (a <= 1.00001) { println(funktion(a)); /* wende Funktion an und gib aus */ a += 0.1; /* inkrementiere a */ } println("Ende."); }
Man teste die Beispiele
sm09_b20.rgg Verwendung von Arrays
sm09_b22.rgg for-Schleife für Seitenzweige
sm09_b11.rgg Bedingungen für Regelanwendungen
sm09_b12.rgg Bedingungen für Regelanwendungen(2. Variante)
sm09_b13.rgg Verknüpfung zweier Bedingungen
Stochastische L-SystemeVerwendung von Pseudozufallszahlen
Beispiel:
deterministisch stochastisch
Axiom ==> L(100) D(5) A;
A ==> F0 LMul(0.7) DMul(0.7) [ RU(50) A ] [ RU(-10) A ];
Axiom ==> L(100) D(5) 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:
Math.random() erzeugt Gleitkomma-Zufallszahl zwischen 0 und 1
random(a, b) erzeugt Gleitkomma-Zufallszahl zwischen a und b
probability(x) liefert 1 mit Wahrscheinlichkeit x,0 mit Wahrscheinlichkeit 1–x
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
Kontextsensitivität
Abfrage eines Kontexts, der vorhanden sein muss, damit eine Regel anwendbar ist
Angabe des Kontexts in (* .... *)
Beispiel:
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ünA(t), (t == 5) ==> B(10, 4); // 4 = rotB(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
Man teste die Beispiele
sm09_b14.rgg Verwendung eines linken Kontexts
sm09_b15.rgg Verwendung eines rechten Kontexts
sm09_b10.gsz Verwendung einer Oberflächentextur (Blatttextur)
Anleitung zum Erstellen eines GroIMP-Projekts mit Texturen aus bereitgestellten Grafikdateien (z.B. Blatt- oder Rindenfotos)
1. File New RGG Project
2. Namen der RGG-Datei (Textdatei) eingeben
3. aus dem GroIMP-Editor das Default-Programm löschen, neues Programm schreiben oder einfügen
4. in Editor speichern (automatische Kompilation muss erfolgreich sein) - texturierte Objekte werden noch vereinfacht dargestellt
5. Panels Explorers 3D Shaders Object New Lambert
6. Namen „Lambert“ zweimal anklicken (mit Pause), überschreiben mit dem Namen, der im Programm vorgesehen ist (Argument der Funktion „shader(...)“ ), abschließen mit <return>
7. Doppelklicken auf Kugel-Icon Attribute Editor öffnet sich
8. dort anklicken: Diffuse colour Surface Maps Image
9. dort anklicken: Image [ ? ] From File
Projekt anlegen(Fortsetzung)
10. Bilddatei auswählen, „öffnen“
11. „Add the file“: OK
12. Editor-Datei neu speichern / kompilieren
- texturierte Objekte werden nun mit Textur dargestellt
13. Speichern des gesamten Projekts:
File Save, Namen des Projekts eingeben (muss nicht mit Namen der RGG-Programmdatei übereinstimmen).
Hausaufgabe:
Lesen Sie Chapter 1, Section 1.7 – 1.10 (ohne 1.9) im Buch „The Algorithmic Beauty of Plants“ von P. Prusinkiewicz und A. Lindenmayer (online verfügbar, siehe Literaturseite zur Veranstaltung). (= S. 28-50 ohne Abschnitt 1.9).