I am working with a hexagonal grid. I have chosen to use this coordinate system because it is quite elegant.
This question talks about generating the coordinates themselves, and is quite useful. My issue now is in converting these coordinates to and from actual pixel coordinates. I am looking for a simple way to find the center of a hexagon with coordinates x,y,z. Assume (0,0) in pixel coordinates is at (0,0,0) in hex coords, and that each hexagon has an edge of length s. It seems to me like x,y, and z should each move my coordinate a certain distance along an axis, but they are interrelated in an odd way I can't quite wrap my head around it.
Bonus points if you can go the other direction and convert any (x,y) point in pixel coordinates to the hex that point belongs in.
First, I should explain the hexagon size and layout. Each hexagon is 28 x 24 pixels, but since the columns overlap, the distance from the center of one hex to the center of the next column's hex is 21.
It is easiest to find the coordinates of A if you think of the hexagon as 6 equilateral triangles. Each side of these triangles are of length r. Since the y axis creates a 30-60-90 triangle where A is one of the vertices, it is pretty easy to find the remaining sides of the triangle.
But why hexagons? Simply put, hexagons are good for visualization because they nest together perfectly and look good. Rectangles are also a good way to show data, and we do it all the time with rasters and imagery data, but the linear patterns of the rectangles are very apparent when zoomed far enough in to see them.
For clarity, let the "hexagonal" coordinates be (r,g,b)
where r
, g
, and b
are the red, green, and blue coordinates, respectively. The coordinates (r,g,b)
and (x,y)
are related by the following:
y = 3/2 * s * b b = 2/3 * y / s x = sqrt(3) * s * ( b/2 + r) x = - sqrt(3) * s * ( b/2 + g ) r = (sqrt(3)/3 * x - y/3 ) / s g = -(sqrt(3)/3 * x + y/3 ) / s r + b + g = 0
Derivation:
I first noticed that any horizontal row of hexagons (which should have a constant y
-coordinate) had a constant b
coordinate, so y
depended only on b
. Each hexagon can be broken into six equilateral triangles with sides of length s
; the centers of the hexagons in one row are one and a half side-lengths above/below the centers in the next row (or, perhaps easier to see, the centers in one row are 3 side lengths above/below the centers two rows away), so for each change of 1
in b
, y
changes 3/2 * s
, giving the first formula. Solving for b
in terms of y
gives the second formula.
The hexagons with a given r
coordinate all have centers on a line perpendicular to the r axis at the point on the r
axis that is 3/2 * s
from the origin (similar to the above derivation of y
in terms of b
). The r
axis has slope -sqrt(3)/3
, so a line perpendicular to it has slope sqrt(3)
; the point on the r
axis and on the line has coordinates (3sqrt(3)/4 * s * r, -3/4 * s * r)
; so an equation in x
and y
for the line containing the centers of the hexagons with r
-coordinate r
is y + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r)
. Substituting for y
using the first formula and solving for x
gives the second formula. (This is not how I actually derived this one, but my derivation was graphical with lots of trial and error and this algebraic method is more concise.)
The set of hexagons with a given r
coordinate is the horizontal reflection of the set of hexagons with that g coordinate, so whatever the formula is for the x
coordinate in terms of r
and b
, the x
coordinate for that formula with g
in place of r
will be the opposite. This gives the third formula.
The fourth and fifth formulas come from substituting the second formula for b
and solving for r
or g
in terms of x
and y
.
The final formula came from observation, verified by algebra with the earlier formulas.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With