112 lines
3.0 KiB
VB.net
112 lines
3.0 KiB
VB.net
Imports System.Text
|
|
|
|
Module Module1
|
|
|
|
Sub Swap(Of T)(ByRef a As T, ByRef b As T)
|
|
Dim c = a
|
|
a = b
|
|
b = c
|
|
End Sub
|
|
|
|
Structure Point
|
|
Dim x As Integer
|
|
Dim y As Integer
|
|
|
|
'rotate/flip a quadrant appropriately
|
|
Sub Rot(n As Integer, rx As Boolean, ry As Boolean)
|
|
If Not ry Then
|
|
If rx Then
|
|
x = (n - 1) - x
|
|
y = (n - 1) - y
|
|
End If
|
|
Swap(x, y)
|
|
End If
|
|
End Sub
|
|
|
|
Public Overrides Function ToString() As String
|
|
Return String.Format("({0}, {1})", x, y)
|
|
End Function
|
|
End Structure
|
|
|
|
Function FromD(n As Integer, d As Integer) As Point
|
|
Dim p As Point
|
|
Dim rx As Boolean
|
|
Dim ry As Boolean
|
|
Dim t = d
|
|
Dim s = 1
|
|
While s < n
|
|
rx = ((t And 2) <> 0)
|
|
ry = (((t Xor If(rx, 1, 0)) And 1) <> 0)
|
|
p.Rot(s, rx, ry)
|
|
p.x += If(rx, s, 0)
|
|
p.y += If(ry, s, 0)
|
|
t >>= 2
|
|
|
|
s <<= 1
|
|
End While
|
|
Return p
|
|
End Function
|
|
|
|
Function GetPointsForCurve(n As Integer) As List(Of Point)
|
|
Dim points As New List(Of Point)
|
|
Dim d = 0
|
|
While d < n * n
|
|
points.Add(FromD(n, d))
|
|
d += 1
|
|
End While
|
|
Return points
|
|
End Function
|
|
|
|
Function DrawCurve(points As List(Of Point), n As Integer) As List(Of String)
|
|
Dim canvas(n, n * 3 - 2) As Char
|
|
For i = 1 To canvas.GetLength(0)
|
|
For j = 1 To canvas.GetLength(1)
|
|
canvas(i - 1, j - 1) = " "
|
|
Next
|
|
Next
|
|
|
|
For i = 1 To points.Count - 1
|
|
Dim lastPoint = points(i - 1)
|
|
Dim curPoint = points(i)
|
|
Dim deltaX = curPoint.x - lastPoint.x
|
|
Dim deltaY = curPoint.y - lastPoint.y
|
|
If deltaX = 0 Then
|
|
'vertical line
|
|
Dim row = Math.Max(curPoint.y, lastPoint.y)
|
|
Dim col = curPoint.x * 3
|
|
canvas(row, col) = "|"
|
|
Else
|
|
'horizontal line
|
|
Dim row = curPoint.y
|
|
Dim col = Math.Min(curPoint.x, lastPoint.x) * 3 + 1
|
|
canvas(row, col) = "_"
|
|
canvas(row, col + 1) = "_"
|
|
End If
|
|
Next
|
|
|
|
Dim lines As New List(Of String)
|
|
For i = 1 To canvas.GetLength(0)
|
|
Dim sb As New StringBuilder
|
|
For j = 1 To canvas.GetLength(1)
|
|
sb.Append(canvas(i - 1, j - 1))
|
|
Next
|
|
lines.Add(sb.ToString())
|
|
Next
|
|
Return lines
|
|
End Function
|
|
|
|
Sub Main()
|
|
For order = 1 To 5
|
|
Dim n = 1 << order
|
|
Dim points = GetPointsForCurve(n)
|
|
Console.WriteLine("Hilbert curve, order={0}", order)
|
|
Dim lines = DrawCurve(points, n)
|
|
For Each line In lines
|
|
Console.WriteLine(line)
|
|
Next
|
|
Console.WriteLine()
|
|
Next
|
|
End Sub
|
|
|
|
End Module
|