Посмотрите на эту картину
Как вы можете видеть, существует относительно интуитивно понятный способ сопоставления прямоугольной системы координат x, y с шестиугольной.
Мы можем говорить о «прямоугольных» неправильных шестиугольниках, то есть шестиугольниках, вписанных в эллипсы, или шестиугольниках, полученных из правильных шестиугольников, масштабированных в обоих направлениях непропорционально (без вращений-сдвигов).
Прямоугольный шестиугольник может быть определен высотой и шириной описывающего прямоугольника плюс ширина вписывающего прямоугольника. (Ш, ш, ч)
Самый простой способ узнать гексагональный индекс - это разделить пространство следующим образом:
Ширина прямоугольника равна w + (W - w) / 2 = (w + W) / 2, его высота h / 2; ширина зеленого прямоугольника равна (Ww) / 2. Легко узнать, в каком прямоугольнике находится точка:
u и v - координаты напоминания, указывающие, где находится точка в прямоугольнике i, j: используя w, мы можем сказать, находимся ли мы в зеленой зоне (u <(Ww) / 2) или нет.
если это так, мы находимся в зеленой зоне, нам нужно знать, находимся ли мы в верхней или нижней половине шестиугольника: мы в верхней половине, если i и j оба четные или оба нечетные; в противном случае мы находимся в нижней половине.
В обоих случаях полезно преобразовывать u и v, чтобы они варьировались от 0 до 1:
если мы находимся в нижней половине и V <U
или
если мы находимся в верхней половине и (1-V)> U
тогда мы уменьшаем я на один
Теперь нам просто нужно уменьшить j на единицу, если i нечетно, чтобы увидеть, что i - это горизонтальный шестиугольный индекс (столбец), а целая часть j / 2 - вертикальный шестиугольный индекс (строка).
Обычные шестиугольники имеют шесть осей симметрии, но я предполагаю, что ваши шестиугольники имеют только две оси симметрии ( т.е. все углы не являются точно 60-градусными). Не обязательно, потому что у вас нет полной симметрии, но потому что это может быть полезно для кого-то еще.
Вот параметры одного шестиугольника. Его центр
O
, наибольшая ширина2a
, высота2b
и длина верхнего края2c
.Это расположение строк / столбцов с началом координат в центре нижнего левого шестиугольника. Если ваша установка отличается, переведите ваши
(x,y)
координаты, чтобы использовать этот случай, или используйте-y
вместо,y
например:Следующий код даст вам строку и столбец шестиугольника, содержащего точку
(x,y)
:Вы можете проверить, что вышеприведенный код рисует идеальные шестиугольники на этом запуске IdeOne .
источник
Вы можете разместить 3 повернутых прямоугольника внутри области шестиугольника, и если все сделано правильно, это точно заполнит область. Тогда это будет просто вопрос проверки на столкновение на трех прямоугольниках.
источник
Вам, вероятно, не нужно отменять регистрацию кликов между плитками. То есть, это не повредит и может даже помочь игроку, если вы позволите промежуткам между плитками также быть активными, если вы не говорите о большом промежутке между ними, который заполнен чем-то, что по логике не должно быть нажатым. (Скажем, гексы - это города на большой карте, где между ними находятся другие способные к щелчку вещи, такие как люди)
Чтобы сделать вышеупомянутое, вы можете просто нанести на карту центры всех гексов, а затем найти ближайший к мыши при нажатии на плоскость всех гексов. Ближайший центр на плоскости мозаичных шестиугольников всегда будет таким же, над которым вы зависаете.
источник
Я уже отвечал на аналогичный вопрос с одинаковыми целями в отношении переполнения стека. Я опубликую его здесь для удобства: (NB - весь код написан и протестирован на Java)
Это изображение показывает верхний левый угол гексагональной сетки и наложена синяя квадратная сетка. Легко определить, какой из квадратов находится внутри, и это дало бы грубое приближение к какому шестиугольнику тоже. Белые части шестиугольников показывают, где квадрат и шестиугольная сетка имеют одинаковые координаты, а серые части шестиугольников показывают, где их нет.
Решение теперь так же просто, как найти, в каком поле находится точка, затем проверить, находится ли точка в каком-либо из треугольников, и исправить ответ, если необходимо.
В этот момент у нас есть строка и столбец прямоугольника, в котором находится наша точка, затем нам нужно проверить нашу точку на двух верхних краях шестиугольника, чтобы увидеть, находится ли наша точка в каком-либо из шестиугольников выше:
Наличие относительных координат облегчает следующий шаг.
Как и на изображении выше, если у нашей точки > mx + c, мы знаем, что наша точка лежит над линией, а в нашем случае - шестиугольником выше и слева от текущей строки и столбца. Обратите внимание, что система координат в java имеет y, начинающийся с 0 в верхнем левом углу экрана, а не нижний левый, как обычно в математике, следовательно, отрицательный градиент, используемый для левого края, и положительный градиент, используемый для правого.
Краткое объяснение переменных, использованных в приведенном выше примере:
m - градиент, поэтому m = c / halfWidth
Дополнение Неошамама к вышесказанному
Это дополнение к ответу Себастьяна Троя. Я бы оставил это как комментарий, но мне пока не хватает репутации.
Если вы хотите реализовать осевую систему координат, как описано здесь: http://www.redblobgames.com/grids/hexagons/
Вы можете внести небольшие изменения в код.
Вместо того
использовать этот
Это приведет к тому, что координата (0, 2) будет находиться в том же диагональном столбце, что и (0, 0) и (0, 1), вместо того, чтобы находиться непосредственно под (0, 0).
источник
Если все ваши шестиугольники сделаны с одинаковыми пропорциями и размещением, вы можете использовать какой-либо актив оверлея для столкновений, что-то вроде:
Затем все, что вам нужно сделать, это поместить изображение столкновения в то место, где находится ваш шестиугольник, получить положение мыши относительно левого угла и посмотреть, НЕ является ли пиксель относительного положения НЕ белым (что означает столкновение).
Код (не проверен):
Очевидно, вы могли бы выполнить проверку столкновения прямоугольника заранее (всего вашего изображения шестиугольника), чтобы улучшить производительность всего процесса.
Концепция довольно проста для понимания и реализации, но работает, только если ваши шестиугольники одинаковы. Это также может сработать, если у вас есть только набор возможных размеров шестиугольника, что будет означать, что вам потребуется более одного наложения на столкновение.
Если вы обнаружите, что это очень упрощенное решение того, что может быть намного более полным и многократно используемым (с использованием математики, чтобы действительно найти столкновение), но, безусловно, стоит попробовать, по моему мнению.
источник
Там есть статья об игровом программировании Gems 7 называется Для Пчелы и Gamers: Как обращаться с шестиугольной , который будет именно то , что вам нужно.
К сожалению, в данный момент у меня нет своей копии книги, иначе я мог бы описать ее немного.
источник