Я работаю с шестиугольной сеткой. Я принял решение использовать эту систему координат, потому что это довольно изящно.
Этот вопрос говорит о генерировании самих координат и довольно полезен. Моя проблема теперь находится в преобразовании этих координат к и от координат фактического пикселя. Я ищу простой способ найти центр шестиугольника с координатами x, y, z. Примите (0,0) в пиксельных координатах, в (0,0,0) в шестнадцатеричных проводах, и что каждый шестиугольник имеет край длины s. Это кажется мне как x, y, и z должен каждый переместить мою координату определенное расстояние вдоль оси, но они взаимосвязаны нечетным способом, которым я не могу вполне перенести голову вокруг этого.
Бонусные очки, если можно пойти другое направление и преобразовать кого-либо (x, y) точка в пиксельных координатах шестнадцатеричному числу, которого принадлежит точка.
Для ясности пусть «гексагональные» координаты будут (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
.
Окончательная формула пришла из наблюдения, проверенного алгеброй с более ранними формулами.