Heim

Hilbert-Kurve

In der Mathematik ist die Hilbert-Kurve eine stetige Kurve, die – durch Wiederholung ihres Konstruktionsverfahrens – jedem beliebigen Punkt einer quadratischen Fläche beliebig nahe kommt und die Fläche vollständig ausfüllt. Die Hilbert-Kurve ist eine sogenannte raumfüllende oder FASS-Kurve. Sie wurde 1891 von dem deutschen Mathematiker David Hilbert entdeckt. Die Möglichkeit, mit einer stetigen eindimensionalen Kurve ein zweidimensionales Gebiet komplett abdecken zu können, war den Mathematikern des neunzehnten Jahrhunderts neu (siehe auch Monsterkurve).

Die euklidische Länge der Kurve Hn ist , d.h. wächst exponentiell mit n.

Mit der Entwicklung von Parallelrechnern haben raumfüllende Kurven wie die Hilbert-Kurve eine Anwendungsmöglichkeit erhalten, indem man sie zur Bestimmung der Lastverteilung der einzelnen Prozessoren nutzt.

Hilbert-Kurve 1. Ordnung
Hilbert-Kurven
1. und 2. Ordnung
Hilbert-Kurven 1. bis 3. Ordnung


 Commons: Hilbert-Kurve – Bilder, Videos und Audiodateien

Programmcode

Das folgende Java-Applet zeichnet eine Hilbert-Kurve mit vier rekursiven Methoden:

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

public class HilbertKurve extends Applet {
    private SimpleGraphics sg=null;
    private int dist0=512, dist=dist0;

    public void init() {
        sg = new SimpleGraphics(getGraphics());
        dist0 = 512;
        resize ( dist0, dist0 );
    }

    public void paint(Graphics g) {
        int level=4;
        dist=dist0;
        for (int i=level;i>0;i--) dist /= 2;
        sg.goToXY ( dist/2, dist/2 );
        hilbertA(level);        //    Rekursion starten
    }

    private void hilbertA (int level) {
        if (level > 0) {
            hilbertB(level-1);    sg.lineRel(0,dist);
            hilbertA(level-1);    sg.lineRel(dist,0);
            hilbertA(level-1);    sg.lineRel(0,-dist);
            hilbertC(level-1);
        }
    }

    private void hilbertB (int level) {
        if (level > 0) {
            hilbertA(level-1);    sg.lineRel(dist,0);
            hilbertB(level-1);    sg.lineRel(0,dist);
            hilbertB(level-1);    sg.lineRel(-dist,0);
            hilbertD(level-1);
        }
    }

    private void hilbertC (int level) {
        if (level > 0) {
            hilbertD(level-1);    sg.lineRel(-dist,0);
            hilbertC(level-1);    sg.lineRel(0,-dist);
            hilbertC(level-1);    sg.lineRel(dist,0);
            hilbertA(level-1);
        }
    }

    private void hilbertD (int level) {
        if (level > 0) {
            hilbertC(level-1);    sg.lineRel(0,-dist);
            hilbertD(level-1);    sg.lineRel(-dist,0);
            hilbertD(level-1);    sg.lineRel(0,dist);
            hilbertB(level-1);
        }
    }
}

class SimpleGraphics {
    private Graphics g = null;
    private int x = 0, y = 0;    

    public SimpleGraphics(Graphics g) { this.g = g; }
    public void goToXY(int x, int y) { this.x = x;   this.y = y; }

    public void lineRel(int deltaX, int deltaY) {
        g.drawLine ( x, y, x+deltaX, y+deltaY );
        x += deltaX;    y += deltaY;
    }
}