Моя 2D-изометрическая игра использует гексагональную сетку. Как показано на рисунке ниже, как я могу повернуть голубые шестиугольные структуры на 60 градусов вокруг розовых шестиугольников?
РЕДАКТИРОВАТЬ:
Главный гекс (0,0). Другие гексы - это дети, их количество фиксировано. Я собираюсь определить только одну позицию (в данном случае ее справа) и вычислить другие направления, если это необходимо (левый-нижний, правый-нижний, правый-верхний, левый-верхний и левый). Другие гексы определены как: Package.Add (-1,0), Package.Add (-2,0) и так далее.
switch(Direction)
{
case DirRightDown:
if(Number.Y % 2 && Point.X % 2)
Number.X += 1;
Number.Y += Point.X + Point.Y / 2;
Number.X += Point.X / 2 - Point.Y / 1.5;
break;
}
В этом коде Number
это основной гекс и Point
это гекс, который я хочу повернуть, но он не работает:
2d
rotation
maps
hexagonal-grid
ruzsoo
источник
источник
Ответы:
Как мартин сойка отмечает , вращение проще, если вы конвертируете в другую систему координат, выполняете вращение, а затем конвертируете обратно.
Я использую другую систему координат, чем Мартин, помеченную
x,y,z
. В этой системе нет колебаний, и это полезно для множества шестнадцатеричных алгоритмов. В этой системе вы можете вращать гекс вокруг0,0,0
, «вращая» координаты и переключая их знаки:x,y,z
превращается в-y,-z,-x
одну сторону и-z,-x,-y
другую сторону. У меня есть диаграмма на этой странице .(Я сожалею о x / y / z против X / Y, но я использую x / y / z на моем сайте, а вы используете X / Y в своем коде, поэтому в этом ответе дело имеет значение! Поэтому я собираюсь использовать
xx,yy,zz
в качестве имен переменных, приведенных ниже, чтобы их было легче различить.)Преобразуйте ваши
X,Y
координаты вx,y,z
формат:Выполните поворот на 60 ° в одну или другую сторону:
Конвертировать
x,y,z
обратно в вашX,Y
:Например, если вы начинаете с (X = -2, Y = 1) и хотите повернуть на 60 ° вправо, вы должны преобразовать:
затем поверните на
-2,1,1
60 ° вправо с помощью:как вы видите здесь:
затем преобразовать
-1,2,-1
обратно:Итак, (X = -2, Y = 1) поворачивается на 60 ° прямо в (X = -2, Y = -1).
источник
Давайте сначала определим новый номер. Не беспокойтесь, это легко.
Или, проще говоря: f = √3 × i , где i - мнимая единица . При этом поворот на 60 градусов по часовой стрелке - это то же самое, что умножение на 1/2 × (1 - f ) , а поворот на 60 градусов против часовой стрелки - на умножение на 1/2 × (1 + f ) . Если это звучит странно, помните, что умножение на комплексное число совпадает с вращением в 2D-плоскости. Мы просто "раздавливаем" комплексные числа в воображаемом направлении немного (на √3), чтобы не иметь дело с квадратными корнями ... или нецелыми числами, если на то пошло.
Мы также можем записать точку (a, b) как a + b × f .
Это позволяет нам вращать любую точку на плоскости; например, точка (2,0) = 2 + 0 × f поворачивается к (1, -1), затем к (-1, -1), (-2,0), (-1,1), ( 1,1) и, наконец, вернуться к (2,0), просто умножив его.
Конечно, нам нужен способ перевести эти точки из наших координат в те, в которых мы делаем повороты, и затем обратно. Для этого нужен еще один бит информации: если точка, вокруг которой мы вращаемся, находится «влево» или «вправо» от вертикальной линии. Для простоты мы объявляем, что оно имеет значение «колебания» w, равное 0, если оно находится слева от него (как центр вращения [0,0] на двух ваших нижних рисунках), и 1, если оно находится справа этого Это расширяет наши оригинальные точки, чтобы быть трехмерным; ( х , у , ш ), где "w" равно 0 или 1 после нормализации. Функция нормализации:
НОРМА: ( x , y , w ) -> ( x + этаж ( w / 2), y , w mod 2), с заданной операцией «mod», которая возвращает только положительные значения или ноль.
Наш алгоритм теперь выглядит следующим образом:
Преобразуйте наши точки ( a , b , c ) в их положения относительно центра вращения ( x , y , w ), вычисляя ( a - x , b - y , c - w ), а затем нормализуя результат. Это ставит центр вращения в (0,0,0), очевидно.
Преобразуйте наши точки из их «нативных» координат в комплексные вращательные: ( a , b , c ) -> (2 × a + c , b ) = 2 × a + c + b × f
Поверните наши точки, умножив их на одно из вращательных чисел выше, по мере необходимости.
Ра-преобразовать точки обратно из координат вращения в их "родные" координаты: ( r , s ) -> (floor ( r / 2), s , r mod 2), с "mod", определенным, как указано выше.
Повторно трансформируйте точки обратно в исходное положение, добавив их в центр вращения ( x , y , z ) и нормализуя.
Простая версия наших «триплексных» чисел на основе f в C ++ будет выглядеть так:
источник