Гексагональные координаты сетки в пиксельные координаты

Я работаю с гексагональной сеткой. Я решил использовать эту систему координат, потому что она довольно элегантна.

сетка

Этот вопрос говорит о генерации самих координат и весьма полезен. Моя проблема сейчас заключается в преобразовании этих координат в и из фактических координат пикселей. Я ищу простой способ найти центр шестиугольника с координатами 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,

  • Окончательная формула пришла из наблюдения, проверенного алгеброй с более ранними формулами.

Другие вопросы по тегам