// Der deutsche
Mathematiker David Hilbert (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. Der
// nachfolgende Code ist die Umsetzung in
Delphi.
// Wenn man "abstand = 1" wählt, wird auch wirklich jeder Punkt
// des
Quadrates durchlaufen.
// Es wird davon ausgegangen, dass sich eine Paintbox auf
// Form1
befindet.
// Getestet mit D4 unter XP
|
|
|
|
Wiederholung = 1
Abstand = 10 |
Wiederholung = 2
Abstand = 10 |
Wiederholung = 3
Abstand = 10 |
Wiederholung = 5
Abstand = 3 |
uses Math;
type
drctn = (eins, zwei, drei, vier);
var
x, y: integer;
abstand: integer = 3;
wiederholung: integer = 5;
procedure nachrechts(wieviel: integer);
begin
inc(x, wieviel);
Form1.Paintbox1.canvas.lineto(x, y);
end;
procedure nachlinks(wieviel: integer);
begin
dec(x, wieviel);
Form1.Paintbox1.canvas.lineto(x, y);
end;
procedure nachunten(wieviel: integer);
begin
inc(y, wieviel);
Form1.Paintbox1.canvas.lineto(x, y);
end;
procedure nachoben(wieviel: integer);
begin
dec(y, wieviel);
Form1.Paintbox1.canvas.lineto(x, y);
end;
procedure hilbert(stufe: integer; direction: drctn);
begin
if stufe = 1 then begin
case direction of
eins: begin
nachunten(abstand);
nachrechts(abstand);
nachoben(abstand);
end;
zwei: begin
nachoben(abstand);
nachlinks(abstand);
nachunten(abstand);
end;
drei: begin
nachrechts(abstand);
nachunten(abstand);
nachlinks(abstand);
end;
vier: begin
nachlinks(abstand);
nachoben(abstand);
nachrechts(abstand);
end;
end;
end else begin
case direction of
eins: begin
hilbert(stufe - 1, drei);
nachunten(abstand);
hilbert(stufe - 1, eins);
nachrechts(abstand);
hilbert(stufe - 1, eins);
nachoben(abstand);
hilbert(stufe - 1, vier);
end;
zwei: begin
hilbert(stufe - 1, vier);
nachoben(abstand);
hilbert(stufe - 1, zwei);
nachlinks(abstand);
hilbert(stufe - 1, zwei);
nachunten(abstand);
hilbert(stufe - 1, drei);
end;
drei: begin
hilbert(stufe - 1, eins);
nachrechts(abstand);
hilbert(stufe - 1, drei);
nachunten(abstand);
hilbert(stufe - 1, drei);
nachlinks(abstand);
hilbert(stufe - 1, zwei);
end;
vier: begin
hilbert(stufe - 1, zwei);
nachlinks(abstand);
hilbert(stufe - 1, vier);
nachoben(abstand);
hilbert(stufe - 1, vier);
nachrechts(abstand);
hilbert(stufe - 1, eins);
end;
end;
end;
end;
procedure hilbertkurve(stufe: integer);
begin
if abstand >= 1 then begin
if stufe >= 1 then begin
hilbert(stufe, eins);
if odd(stufe) then nachrechts(1) else nachoben(1);
end else showmessage('Wiederholung muss mindestens 1 sein');
end else showmessage('Abstand muss mindestens 1 sein');
end;
// Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
x := 0;
y := 0;
with Paintbox1, canvas do begin
width := trunc(intpower(2, wiederholung) * abstand) - pred(abstand);
height := width;
application.processmessages;
brush.color := clYellow;
fillrect(cliprect);
pen.color := clNavy;
moveto(x, y);
end;
hilbertkurve(wiederholung);
end;
|