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.
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 constantb
coordinate, soy
depended only onb
. Each hexagon can be broken into six equilateral triangles with sides of lengths
; 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 of1
inb
,y
changes3/2 * s
, giving the first formula. Solving forb
in terms ofy
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 ther
axis that is3/2 * s
from the origin (similar to the above derivation ofy
in terms ofb
). Ther
axis has slope-sqrt(3)/3
, so a line perpendicular to it has slopesqrt(3)
; the point on ther
axis and on the line has coordinates(3sqrt(3)/4 * s * r, -3/4 * s * r)
; so an equation inx
andy
for the line containing the centers of the hexagons withr
-coordinater
isy + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r)
. Substituting fory
using the first formula and solving forx
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 thex
coordinate in terms ofr
andb
, thex
coordinate for that formula withg
in place ofr
will be the opposite. This gives the third formula.The fourth and fifth formulas come from substituting the second formula for
b
and solving forr
org
in terms ofx
andy
.The final formula came from observation, verified by algebra with the earlier formulas.
来源:https://stackoverflow.com/questions/2459402/hexagonal-grid-coordinates-to-pixel-coordinates