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

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

grid

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

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

45
задан Community 23 May 2017 в 11:46
поделиться

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 * с. от источника (аналогично приведенному выше выводу 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 .

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

41
ответ дан 26 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: