Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Multimedia

k23:k23.3:k23.3.5:k23.3.5.8:start

23.3.5.8 Hilbert-Kurve

Im diesem Projekt von Tobias Boege wird eine Hilbert-Kurve beliebiger Ordnung gezeichnet – zumindest theoretisch. Praktisch können Sie noch Kurven bis zur Ordnung 8 oder 9 auf einem normalen Monitor sehen.

B1

Abbildung 23.3.5.8.1: Hilbert-Kurve 6. Ordnung

Das Programm startet mit einer Hilbert-Kurve der Ordnung 4. Mit den Tasten „+“ und „-“ können Sie die Ordnung ändern.

B1

Abbildung 23.3.5.8.2: Start-Kurve mit N=4

Der Projekt-Quelltext ist sehr kurz und zeigt den Einsatz von Methoden der Klasse Paint – insbesondere von Paint.Scale() und Paint.Translate(). Es wird gezeigt, wie man Funktionen schreibt, die vom aktuellen Paint-Device unabhängig sind, denn mit den Funktionen im Projekt kann man sowohl auf eine DrawingArea als auch auf ein Picture zeichnen, ohne etwas zu ändern.

Der Quelltext liest sich etwas schwerer, weil in der Prozedur _HilbertKurve(…) zum Teil rekursiv programmiert wird und der Quelltext somit sehr kompakt wird.

' Gambas class file
 
Private $iOrder As Integer = 4
Private $iX As Integer
Private $iY As Integer
 
Public Sub Form_Open()
  FMain.Center
  FMain.Height = (9 / 16) * FMain.Width
End
 
Public Sub Form_KeyPress()
  If Key.Code = Key["+"] Then
    Inc $iOrder
    dwgKurve.Refresh()
  Else If Key.Code = Key["-"] And If $iOrder > 0 Then
    Dec $iOrder
    dwgKurve.Refresh()
  Endif
 
End
 
Public Sub dwgKurve_Draw()
  $iX = 0
  $iY = 0
  Inc Application.Busy
    FMain.Title = "HilbertCurve - N = " & $iOrder 
    HilbertCurve($iOrder)
  Dec Application.Busy
End
 
Private Sub HilbertCurve(Order As Integer)
  With Paint.Device
    Paint.Scale(.W / 2 ^ Order, .H / 2 ^ Order)
    Paint.Translate(0.5, 0.5)
    Paint.LineWidth = 2 ^ Order / Min(.W, .H)
  End With
  _HilbertCurve(0, 1, Order)
  Paint.Stroke()
End
 
' Found in Warren, Henry S. Jr.: Hacker's Delight. 2nd ed. Addison-Wesley (2013), pp. 356ff.
' The routine is attributed to Voorhies, Douglas: Space-Filling Curves and a Measure of Coherence.
' Graphics Gems II, AP Professional (1991).
 
Private Sub _HilbertCurve(Direction As Integer, Rotation As Integer, Order As Integer)
  If Order = 0 Then Return
 
  Direction += Rotation
  _HilbertCurve(Direction, - Rotation, Order – 1) ' Rekursion 1
  _HilbertStep(Direction)
 
  Direction -= Rotation
  _HilbertCurve(Direction, Rotation, Order - 1) ' Rekursion 2
  _HilbertStep(Direction)
  _HilbertCurve(Direction, Rotation, Order - 1) ' Rekursion 3
 
  Direction -= Rotation
  _HilbertStep(Direction)
  _HilbertCurve(Direction, - Rotation, Order - 1) ' Rekursion 4
End
 
Private Sub _HilbertStep(Direction As Integer)
  Select Case Direction And 3
    Case 0
      Inc $iX
    Case 1
      Inc $iY
    Case 2
      Dec $iX
    Case 3
      Dec $iY
  End Select
  Paint.LineTo($iX, $iY)
End

Download

Die Website verwendet zwei temporäre Session-Cookies. Diese technisch notwendigen Cookies werden gelöscht, wenn der Web-Browser geschlossen wird! Informationen zu Cookies erhalten Sie in der Datenschutzerklärung.
k23/k23.3/k23.3.5/k23.3.5.8/start.txt · Zuletzt geändert: 20.06.2016 (Externe Bearbeitung)

Seiten-Werkzeuge