Map storage with hexagons[1] isn't as straightforward as with rectangular maps on a square grid. A rhombus shaped hex grid corresponds to a 2d rectangular array. But a hexagonal shaped hex grid doesn't. A reader had an idea for storing hexagon-shaped hex maps with three rhombuses[2]. I implemented a diagram demonstrating it.
The main idea is that we look for sections with one coordinate being >=0 and one being <0.
if (q >= 0 && r < 0) { return q * radius - r } else if (r >= 0 && s < 0) { return rhombusSize + r * radius - s } else if (s >= 0 && q < 0) { return 2*rhombusSize + s * radius - q } else { return 0 }
There are many variants of which order to check the coordinates in, and how they get multiplied into the index, and each variant produces a different subdivision into rhombuses.
Also see Hex Directions, which divides the hexagon into six areas instead of the three here, based on whether q
, r
, or s
is the largest. Another way to store a hexagonal shaped hex grid is to use spirals[3], either counting from the outside[4] or counting from the inside[5]. Counting from the inside allows growing the map.