private static Grid <bool> ResolveComponent(HilbertCurveComponent val) { var result = new Grid <bool>(new Coord(3, 3)); // corners are always true result.SetCell(new Coord(0, 0), true); // top left result.SetCell(new Coord(0, 2), true); // top right result.SetCell(new Coord(2, 0), true); // bottom left result.SetCell(new Coord(2, 2), true); // bottom right if (val == HilbertCurveComponent.A) // bottom missing { result.SetCell(new Coord(0, 1), true); // top middle result.SetCell(new Coord(1, 0), true); // left middle result.SetCell(new Coord(1, 2), true); // right middle } else if (val == HilbertCurveComponent.B) // right missing { result.SetCell(new Coord(0, 1), true); // top middle result.SetCell(new Coord(1, 0), true); // left middle result.SetCell(new Coord(2, 1), true); // bottom middle } else if (val == HilbertCurveComponent.C) // top missing { result.SetCell(new Coord(1, 0), true); // left middle result.SetCell(new Coord(1, 2), true); // right middle result.SetCell(new Coord(2, 1), true); // bottom middle } else if (val == HilbertCurveComponent.D) // left missing { result.SetCell(new Coord(0, 1), true); // top middle result.SetCell(new Coord(1, 2), true); // right middle result.SetCell(new Coord(2, 1), true); // bottom middle } return(result); }
private static Grid <HilbertCurveComponent> initialState(HilbertCurveComponent orientation) { var result = new Grid <HilbertCurveComponent>(new Coord(1, 1)); result.SetCell(new Coord(0, 0), orientation); return(result); }
public static Grid <bool> GenerateHilbertCurve(int size, HilbertCurveComponent orientation = HilbertCurveComponent.A) { var result = initialState(orientation); for (int x = 0; x < size; x++) { result = IterateHilbertCurve(result); } return(ResolveCurve(result)); }
private static Grid <HilbertCurveComponent> IterateCurveComponent(HilbertCurveComponent component) { List <HilbertCurveComponent> list; switch (component) { case HilbertCurveComponent.A: list = new List <HilbertCurveComponent> { HilbertCurveComponent.A, HilbertCurveComponent.A, HilbertCurveComponent.D, HilbertCurveComponent.B }; break; case HilbertCurveComponent.B: list = new List <HilbertCurveComponent> { HilbertCurveComponent.B, HilbertCurveComponent.C, HilbertCurveComponent.B, HilbertCurveComponent.A }; break; case HilbertCurveComponent.C: list = new List <HilbertCurveComponent> { HilbertCurveComponent.D, HilbertCurveComponent.B, HilbertCurveComponent.C, HilbertCurveComponent.C }; break; case HilbertCurveComponent.D: list = new List <HilbertCurveComponent> { HilbertCurveComponent.C, HilbertCurveComponent.D, HilbertCurveComponent.A, HilbertCurveComponent.D }; break; default: throw new Exception("Hilbert Curve component " + component.ToString() + " not handled in IterateCurveComponent()"); } return(list.ToGrid(new Coord(2))); }