54 lines
813 B
Go
54 lines
813 B
Go
package main
|
|
|
|
type HilbertCurve struct {
|
|
order int
|
|
curve *Matrix
|
|
}
|
|
|
|
func NewHilbertCurve() *HilbertCurve {
|
|
h := &HilbertCurve{
|
|
curve: NewMatrix(2, 2),
|
|
}
|
|
|
|
h.curve.Set(0, 0, 1)
|
|
h.curve.Set(0, 1, 0)
|
|
h.curve.Set(1, 0, 2)
|
|
h.curve.Set(1, 1, 3)
|
|
|
|
return h
|
|
}
|
|
|
|
func (h *HilbertCurve) ToString() string {
|
|
return h.curve.ToString()
|
|
}
|
|
|
|
func (h *HilbertCurve) Length() int {
|
|
return h.curve.width * h.curve.height
|
|
}
|
|
|
|
func (h *HilbertCurve) Expand() {
|
|
length := h.Length()
|
|
|
|
m3 := h.curve.Transpose()
|
|
|
|
m0 := m3.Mirror()
|
|
m3.Add(3 * length)
|
|
|
|
h.curve.Add(length)
|
|
|
|
m2 := h.curve.Clone()
|
|
m2.Add(length)
|
|
|
|
bottom := m0.MergeRight(m3)
|
|
|
|
h.curve = h.curve.MergeRight(m2).MergeBottom(bottom)
|
|
h.order++
|
|
}
|
|
|
|
func (h *HilbertCurve) Order() int {
|
|
return h.order
|
|
}
|
|
|
|
func (h *HilbertCurve) Get() *Matrix {
|
|
return h.curve
|
|
}
|