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



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke