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 }