21
Struktur-Funktions-Modelle von Pflanzen - Sommersemester 2015 - Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik 4. Vorlesung: 21. 5. 2015

Struktur-Funktions-Modelle von Pflanzen - Sommersemester 2015 - Winfried Kurth Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik

Embed Size (px)

Citation preview

Struktur-Funktions-Modelle von Pflanzen- Sommersemester 2015 -

Winfried Kurth

Universität Göttingen, Lehrstuhl Computergrafik und Ökologische Informatik

4. Vorlesung: 21. 5. 2015

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

Welche Struktur wird von folgendem L-System erzeugt?

Axiom ==> [ RU(90) M(1) RU(90) A(1) ] A(1);

A(n) ==> F(n) RU(90) A(n+1);

Welche Struktur wird von folgendem 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.

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

einfache Datentypen:

int ganze Zahlen

float Gleitkommazahlen

double Gleitkommazahlen, doppelte Präzision

char Zeichen (characters)

void leerer Typ (für Funktionen, die nichts zurückgeben)

genauer:

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 für x von 0 bis 1 in 0.1-Schritten ausgewertet. Man achte auf Rundungsfehler und auf die richtige Obergrenze für 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."); }

Schachtelung von regelbasiertem und imperativem Code in XL

Schachtelung von regelbasiertem und imperativem Code in XL

Beachten Sie die unterschiedliche Syntax von Kontrollstrukturen im imperativen und im regelbasierten Teil von XL:

imperativ:

{ // ... for (int i = 1; i <= 42; i++) { x[i] = 3*i + 1; }}

regelbasiert:

[ A(x) ==> for (int i = 1; i <= 7; i++) ( RU(15) F(x) );] (ebenso bei if ( ... ) )

Man teste die Beispiele

sm09_b20.rgg Verwendung von Arrays

sm09_b22.rgg for-Schleife für Seitenzweige

Erweiterung zum Beispiel sm09_b07.rgg (farbige Koch-Kurve) mit eingefügtem imperativen Code:

sm09_b07a.rgg Weitergabe von Informationen(hier: Farbe) an Nachfolgeobjekte

Hausaufgabe:

Lesen Sie Chapter 1, Section 1.6 – 1.7 und 1.10/1.10.1 im Buch „The Algorithmic Beauty of Plants“ von P. Prusinkie-wicz und A. Lindenmayer (online verfügbar, siehe Literatur-seite zur Veranstaltung). (= S. 21-30 und 40-43).