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

Werbung
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 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
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
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 */
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 KochKurve) 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. Prusinkiewicz und A. Lindenmayer (online verfügbar, siehe Literaturseite zur Veranstaltung). (= S. 21-30 und 40-43).
Herunterladen