Координаты шестиугольной сетки для координат пикселей - PullRequest
45 голосов
/ 17 марта 2010

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

grid

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

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

1 Ответ

40 голосов
/ 17 марта 2010

Для ясности, пусть "шестиугольные" координаты будут (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.

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

...