|
- Applets : Fraktale : Lindenmayer System -
Das fraktale Lindenmayer-System als Java-Applet.
Der Biologe Aristid Lindenmayer (1925-1985) entwickelte um 1968 ein relativ simples, aber dennoch sehr leistungsfähiges Verfahren, um biologisches Pflanzenwachstum mathematisch zu beschreiben. In einem Lindenmayer-System (kurz: L-System) wird ein mehr oder weniger einfaches Grundmuster, durch fortwährende Wiederholung in die zu beschreibene Form überführt. Die Formenvielfalt reicht von einfachen Sträuchern, bis hin zu fotorealistischen Abbildungen auch kompliziertester pflanzlicher Strukturen.
(Lsystema vulgaris, Fam. Javae)
Start: F Regel: F -> F[+F]F[-F]F Winkel: 27.7°
Lindenmayer.java
import java.awt.*;
import java.applet.*;
public class Lindenmayer extends Applet {
Point a, b; // Verbindungspunkte eines Einzelschritts
int lengthF = 3; // Schrittlänge
double direction; // Richtung in Grad
double rotation = 27.7; // Drehung in Grad
Graphics g;
Graphics2D g2;
public void init() {
setBackground(new Color(255,255,255));
}
public void paint(Graphics g) {
g2 = (Graphics2D) g; // Anti-Aliasing
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(new Color(110,170,60)); // Farbe
a = new Point(115,495); // Start-Punkt
direction = -85; // Start-Richtung in Grad
turtleGraphic(g2, "F", 6); // Axiom und Iterationstiefe
}
public void turtleGraphic(Graphics g2, String instruction, int depth) {
if (depth==0) return;
depth -= 1;
Point aMark = new Point(0,0);
double directionMark = 0;
// Dummy-Werte
int i;
char c;
for (i=0;i<instruction.length();i++) {
c = instruction.charAt(i);
// Schritt Vorwärts
if (c=='F') {
// Produktionsregel iterieren, solange Tiefe nicht erreicht ist
turtleGraphic(g2, "F[+F]F[-F]F", depth);
// Zeichnen: Ab 'a' in Richtung 'direction' einen Schritt der Länge 'lengthF'
if (depth==0) {
double rad = 2*Math.PI/360 * direction; // Grad -> Radiant
int p = (int) (lengthF * Math.cos(rad));
int q = (int) (lengthF * Math.sin(rad));
b = new Point(a.x+p, a.y+q);
g2.drawLine(a.x, a.y, b.x ,b.y);
a = b; // Neuer Startpunkt
}
}
// Drehung links herum
else if (c=='+') direction += rotation;
// Drehung rechts herum
else if (c=='-') direction -= rotation;
// Position und Richtung speichern
else if (c=='[') {
aMark = a;
directionMark = direction;
}
// Zurück zu gespeicherter Position und Richtung
else if (c==']') {
a = aMark;
direction = directionMark;
}
}
}
}
Die Anweisungen in der Produktionsregel F[+F]F[-F]F bedeuten im Einzelnen:
F Einen Strich zeichnen
+ Drehung nach links
- Drehung nach rechts
[ Position und Richtung speichern
] Zurück zu gespeicherten Werten
In jeder Iterationsstufe wird F durch F[+F]F[-F]F ersetzt:
Stufe 0: F
Stufe 1: F[+F]F[-F]F Stufe 2: F[+F]F[-F]F[+F[+F]F[-F]F]F[+F]F[-F]F[-F[+F]F[-F]F]F[+F]F[-F]F
Stufe 3: ...
Obiger Strauch ist das gezeichnete Ergebnis nach sechs Iterationsstufen (Das sind 5^6 = 15625 Zeichenschritte).

(Aristid Lindenmayer)
Download Lindenmayer.zip (Applet und Code ca. 3 kb)
© 2001-2004 Albert Kluge - Alle Rechte vorbehalten
Impressum | Datenschutz | Nutzung | eMail
|