Подтвердить что ты не робот

Координаты гексагональной сетки для пиксельных координат

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

grid

Этот вопрос говорит о генерации самих координат и весьма полезен. Теперь моя проблема заключается в преобразовании этих координат в фактические пиксельные координаты и из них. Я ищу простой способ найти центр шестиугольника с координатами x, y, z. Предположим, что (0,0) в пиксельных координатах находится в (0,0,0) в шестнадцатеричных координатах и ​​что каждый шестиугольник имеет край длины s. Мне кажется, что x, y и z должны перемещать мою координату на некоторое расстояние вдоль оси, но они взаимосвязаны нечетным образом, я не могу полностью обвести вокруг себя голову.

Бонусные очки, если вы можете перейти в другое направление и преобразовать любую точку (x, y) в пиксельные координаты в шестнадцатеричную точку, в которой находится точка.

4b9b3361

Ответ 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.

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