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



Hilbert / Cohn-Vossen: Anschauliche Geometrie
- Anzeige -


- Applets : Fraktale : Hilbert-Kurve -


Die fraktale Hilbert-Kurve als Java-Applet.

David Hilbert (dt. Mathematiker, 1862-1943) beschrieb 1890 eine Kurve, die bei hinreichender Wiederholung ihres Konstruktionsverfahrens, jeden Punkt innerhalb einer quadratischen Fläche erreichen kann, ohne sich selbst zu schneiden.

Ein linker bzw. rechter Mausklick auf das Applet vergrößert oder verringert die Iterationstiefe.


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

Das verwendete L-System Schema:
X, X -> -YF+XFX+FY-, Y -> +XF-YFY-FX+, 90°


Hilbert.java

import java.awt.*;
import java.applet.*;

public class Hilbert extends Applet {

    Point a, b; // Verbindungspunkte eines Einzelschritts

    int lengthF = 128;     // Schrittlänge Startwert
    double direction;      // Richtung in Grad
    double rotation = 90;  // Drehung in Grad

    int depth = 2;         // Iterationen Startwert

    Image buffer;
    Graphics gBuffer;
    Graphics g;


    public void init() {
        setBackground(new Color(255,255,255));
    }

    public boolean mouseDown(Event ev, int x, int y) {
        buffer = null;

        if (!ev.metaDown()) {
            if (depth<9) lengthF = (int) Math.floor(lengthF/2);
            depth += 1;
        }
        else if (depth>2) {
            lengthF = (int) Math.ceil(lengthF*2);
            depth -= 1;
        }
        if (depth>9) depth = 9;
        else repaint();
        return true;
    }

    public void paint(Graphics g) {
        if (buffer!=null) {
            g.drawImage (buffer,0,0, this);
            return;
        }
        buffer = createImage(this.getSize().width, this.getSize().height);
	gBuffer = buffer.getGraphics();

        // Start-Punkt
        int aXY = (int) Math.pow(2,8-depth);
        a = new Point(aXY,aXY);

        direction = 90; // Start-Richtung in Grad

        gBuffer.setColor(new Color(0,0,200));
        turtleGraphic(g, gBuffer, "X", depth);
    }


    public void turtleGraphic(Graphics g, Graphics gBuffer, 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);

            // Produktionsregeln iterieren, solange Tiefe nicht erreicht ist
            if (c=='X') turtleGraphic(g, gBuffer, "-YF+XFX+FY-", depth);
            else if (c=='Y') turtleGraphic(g, gBuffer, "+XF-YFY-FX+", depth);

            // Schritt Vorwärts
            else if (c=='F') {

                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);

                // Animations-Effekt
                try {Thread.sleep(20);}
                catch (InterruptedException e) {}

                gBuffer.drawLine(a.x, a.y, b.x ,b.y);
                g.drawImage (buffer, 0, 0, this);

                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;
            }
        }
    }
}

Kurz vor Hilbert schuf bereits der italienische Mathematiker Guiseppe Peano (1858-1932) eine ähnliche Kurve.
(L-System: X -> XFYFX+F+YFXFY-F-XFYFX und Y -> YFXFY-F-XFYFX+F+YFXFY )

Mehr zum Konstruktionsprinzip des Lindenmayer-Systems finden Sie unter L-System.


David Hilbert

(David Hilbert)


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




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