- 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.
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)
Download Hilbert_Kurve.zip (Applet und Code ca. 3 kb)
© 2001-2004 Albert Kluge - Alle Rechte vorbehalten
Impressum | Datenschutz | Nutzung | eMail
|