Teil 4: L-Systeme (Fortsetzung), imperativer Code

Werbung
Struktur-Funktions-Modelle von Pflanzen
- Sommersemester 2012 -
Winfried Kurth
Universität Göttingen, Lehrstuhl Computergrafik und
Ökologische Informatik
4. Vorlesung: 10. 5. 2012
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 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)
Erweiterung des Symbol-Konzepts:
Lasse reellwertige Parameter nicht nur bei Turtle-Kommandos
wie "RU(45)" und "F(3)" zu, sondern bei allen Zeichen
 parametrische L-Systeme
beliebig lange, endliche Parameterlisten
Parameter werden bei Regel-Matching mit Werten belegt
Beispiel:
Regel
A(x, y) ==> F(7*x+10) B(y/2)
vorliegendes Zeichen z.B.:
nach der Regelanwendung:
A(2, 6)
F(24) B(3)
Parameter können in Bedingungen abgeprüft werden
(logische Bedingungen mit Java-Syntax):
A(x, y) (x >= 17 && y != 0) ==> ....
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.
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 Elemente
durch 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-Schleife
if (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:
logische Operatoren:
Math.PI

&&
und
Math.E
e
||
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
Math.exp
Exponentialfunktion ex
Math.log
natürlicher Logarithmus
Math.max
Maximum zweier Zahlen
Math.min
Minimum zweier Zahlen
Math.round
Rundungsfunktion
Math.sin
Sinus
Umrechung Gradmaß 
Bogenmaß
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
{
return x*x + 1;
}
protected void init()
{
float a = 0.0;
while (a <= 1.00001)
{
println(funktion(a));
a += 0.1;
}
println("Ende.");
}
x)
/* Gleitkommazahl */
/* wende Funktion an und gib aus */
/* inkrementiere a */
Man teste die Beispiele
sm09_b20.rgg
Verwendung von Arrays
sm09_b22.rgg
for-Schleife für Seitenzweige
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. Prusinkiewicz und A. Lindenmayer (online verfügbar, siehe Literaturseite zur Veranstaltung). (= S. 21-30 und 40-43).
Herunterladen