Java & JavaScript


Home
Applets
   3D:
 · Würfel
 · Würfel 2
 · Würfel 3
 · Tetraeder
 · Tetraeder 2
 · Dodekaeder
 · Ikosaeder
 · Fußball
 · Kugel
 · Kugel 2
   Fraktale:
 · Apfelmännchen
 · Apfelmännchen 2
 · Apfelmännchen 3
 · Apfelmännchen MA
 · Apfelmännchen Zoom
 · Apfelmännchen Zoom 2
 · Juliamenge
 · Juliamenge MA
 · Julia-Generator
 · Koch-Kurve
 · Koch-Kurve 2
 · Hilbert-Kurve
 · Sierpinski-Dreieck
 · Sierpinski-Dreieck 2
 · Sierpinski-Dreieck 3
 · Sierpinski-Teppich
 · Pythagoras-Baum
 · Lindenmayer-System
 · Lindenmayer-System 2
   Mathematik:
 · Funktionsplotter
 · Eratosthenes-Sieb
 · Miller-Rabin-Test
   Verschiedenes:
 · Morsezeichen-Ticker
 · Analoguhr
Scripts
Gäste
Kontakt



Deussen: Computergenerierte Pflanzen - Technik und Design digitaler Pflanzenwelten
- Anzeige -


- 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.


[Das fraktale Lindenmayer-System als Java-Applet mit Quellcode zum Download. Das fraktale Lindenmayer-Applet lässt sich allerdings nur mit aktiviertem Java betrachten !]

(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

(Aristid Lindenmayer)


Download  Lindenmayer.zip (Applet und Code ca. 3 kb)




© 2001-2004 Albert Kluge - Alle Rechte vorbehalten
Impressum | Datenschutz | Nutzung | eMail