S.11 Hilbert

目次のページ; 前のページ; 次のページ

 再帰的なプログラミング技法の例としてヒルベルト曲線を例示します。

Public Sub Proc11()  'Hilbert
    Const isize = 400
    Dim ict, lenn, IX, iy, id
    Select Case Ivar
        Case 1: ict = 3
        Case 2: ict = 4
        Case 3: ict = 5
        Case 4: ict = 6
        Case Else: ict = 3
    End Select
    Dperas: Dpwind 0, 0, 640
    lenn = isize / (2 ^ ict)
    IX = (isize / 2) - isize / (2 ^ (ict + 1))
    iy = -(isize / 2) + isize / (2 ^ (ict + 1))
    id = 270 : drawA ict - 1, IX, iy, id, lenn
End Sub
Private Sub drawA(ict, IX, iy, ByVal id, lenn)
    If ict $lt; 0 Then Exit Sub
    id = id - 90: drawB ict - 1, IX, iy, id, lenn: drawLine IX, iy, id, lenn
    id = id + 90: drawA ict - 1, IX, iy, id, lenn: drawLine IX, iy, id, lenn
    drawA ict - 1, IX, iy, id, lenn: id = id + 90: drawLine IX, iy, id, lenn
    drawB ict - 1, IX, iy, id, lenn: id = id - 90
End Sub
Private Sub drawB(ict, IX, iy, ByVal id, lenn)
    If ict $lt; 0 Then Exit Sub
    id = id + 90: drawA ict - 1, IX, iy, id, lenn: drawLine IX, iy, id, lenn
    id = id - 90: drawB ict - 1, IX, iy, id, lenn: drawLine IX, iy, id, lenn
    drawB ict - 1, IX, iy, id, lenn: id = id - 90: drawLine IX, iy, id, lenn
    drawA ict - 1, IX, iy, id, lenn: id = id + 90
End Sub
               
Private Sub drawLine(IX, iy, id, lenn)
    Dim ioldx, ioldy
    If id < 0 Then id = id + 360
    If id >= 360 Then id = id - 360
    ioldx = IX: ioldy = iy
    Select Case id
        Case 0: IX = IX + lenn
        Case 90: iy = iy - lenn
        Case 180: IX = IX - lenn
        Case 270: iy = iy + lenn
    End Select
    Dpmove (ioldx), (ioldy): Dpdraw (IX), (iy)
End Sub

次のページ