Гексагональные координаты сетки в пиксельные координаты
Я работаю с гексагональной сеткой. Я решил использовать эту систему координат, потому что она довольно элегантна.
Этот вопрос говорит о генерации самих координат и весьма полезен. Моя проблема сейчас заключается в преобразовании этих координат в и из фактических координат пикселей. Я ищу простой способ найти центр шестиугольника с координатами x,y,z. Предположим, что (0,0) в пиксельных координатах находится в (0,0,0) в шестнадцатеричных координатах, и что каждый шестиугольник имеет ребро длины s. Мне кажется, что x, y и z должны каждый перемещать мою координату на определенное расстояние вдоль оси, но они странным образом связаны между собой, и я не могу полностью обернуть вокруг нее голову.
Бонусные баллы, если вы можете пойти в другом направлении и конвертировать любую (x,y) точку в пиксельных координатах в гекс, в котором эта точка принадлежит.
1 ответ
Для ясности, пусть "шестиугольные" координаты (r,g,b)
где r
, g
, а также b
координаты красного, зеленого и синего соответственно. Координаты (r,g,b)
а также (x,y)
связаны следующим:
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
Вывод:
Я впервые заметил, что любой горизонтальный ряд шестиугольников (который должен иметь постоянную
y
координата) имела постояннуюb
координата, такy
зависело только отb
, Каждый шестиугольник можно разбить на шесть равносторонних треугольников со сторонами длиныs
; центры шестиугольников в одном ряду равны длине стороны в полтора раза выше / ниже центров в следующем ряду (или, возможно, легче увидеть, центры в одном ряду на 3 длины стороны выше / ниже центров в двух рядах)), так что за каждую смену1
вb
,y
изменения3/2 * s
, дав первую формулу. Решение дляb
с точки зренияy
дает вторую формулу.Шестиугольники с заданным
r
координаты все имеют центры на линии, перпендикулярной оси r в точке наr
ось, которая является3/2 * s
от происхождения (аналогично приведенному выше выводуy
с точки зренияb
).r
ось имеет наклон-sqrt(3)/3
линия, перпендикулярная к ней, имеет наклонsqrt(3)
; точка наr
ось и на линии имеет координаты(3sqrt(3)/4 * s * r, -3/4 * s * r)
; поэтому уравнение вx
а такжеy
для линии, содержащей центры шестиугольников сr
координатаr
являетсяy + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r)
, Подставляя дляy
используя первую формулу и решение дляx
дает вторую формулу. (Это не то, как я на самом деле вывел это, но мой вывод был графическим с большим количеством проб и ошибок, и этот алгебраический метод является более кратким.)Набор шестиугольников с заданным
r
координата - это горизонтальное отражение набора шестиугольников с этой координатой g, поэтому независимо от формулы дляx
координировать с точки зренияr
а такжеb
,x
координата для этой формулы сg
на местеr
будет наоборот. Это дает третью формулу.Четвертая и пятая формулы получены из замены второй формулы для
b
и решение дляr
или жеg
с точки зренияx
а такжеy
,Окончательная формула пришла из наблюдения, проверенного алгеброй с более ранними формулами.