Hilbertova krivulja

Iz testwiki
Pojdi na navigacijo Pojdi na iskanje
Hilbertova krivulja prvega reda
Hilbertova krivulja prvega in drugega reda
Hilbertova krivulja prvega, drugega in tretjega reda
Hilbertova krivulja šestega reda

Hilbertova krivúlja [hílbertova ~] je zvezna fraktalna krivulja, ki zapolni prostor. Prvi jo je opisal David Hilbert leta 1891 kot varianto krivulj, ki zapolnijo prostor, ki jih je odkril Giuseppe Peano leta 1890.[1][2]

Njena Hausdorffova razsežnost je 2. Evklidska dolžina Hn je 2n12n, tj. narašča eksponentno z n.

Računalniški program

Spodnji Java applet nariše Hilbertovo krivuljo z rekurzivno metodo:


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

public class HilbertCurve 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); // start recursion
    }

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

Glej tudi

Sklici

Predloga:Sklici

Viri

Zunanje povezave

Predloga:Zbirka

Predloga:-

Predloga:Ravninske krivulje