public PackedHexagonalGrid(int width, int height, int padding, float spacing) { Width = width; Height = height; Padding = padding; Spacing = spacing; var grid = new FancyHexagonalGrid(spacing); var vertices = CreateVertices(grid, width, height, padding); VerticesX = vertices.Select(v => v.X).ToArray(); VerticesY = vertices.Select(v => v.Y).ToArray(); }
// Create a width x height array of vertices in row-major order // Each row is padded with VectorSize extra elements on both sides private static Vector2[] CreateVertices(FancyHexagonalGrid grid, int width, int height, int padding) { int doublePadding = 2 * padding; int stride = width + doublePadding; var vertices = new Vector2[stride * height]; // Initialize the array with NaNs. for (int i = 0; i < vertices.Length; i++) vertices[i] = new Vector2(AllOnes); // Loop invariant: index = padding + row * stride + col // // Before loop: index = padding, row = 0, col = 0. Invariant holds. int index = padding; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { vertices[index] = grid.GetVertex(col, row); index++; // after col++: // col' = col + 1 // index' = index + 1 = padding + row * stride + col + 1 // = padding + row * stride + col' // Invariant holds. } // col = width // index = padding + row * stride + width index += doublePadding; // after row++ and col = 0 // index' = index + doublePadding // = padding + row * stride + width + doublePadding // = padding + row * stride + stride (stride = width + doublePadding) // = padding + row' * stride + col (col = 0, row' = row + 1) // Invariant holds. } return vertices; }