Я нашел простой альтернативный подход, который использует ту же логику, что и обычная шахматная доска. Он создает эффект привязки к сетке с точками в центре каждой плитки и в каждой вершине (путем создания более узкой сетки и игнорирования чередующихся точек).
Этот подход хорошо работает для игр, таких как Catan, где игроки взаимодействуют с плитками и вершинами, но не подходит для игр, в которых игроки взаимодействуют только с плитками, поскольку он возвращает точку центра или вершину, координаты которой ближе всего, а не какую шестиугольную плитку координаты в пределах.
Геометрия
Если вы поместите точки в сетку со столбцами, которые составляют четверть ширины плитки, и строками, которые в два раза меньше высоты плитки, вы получите следующий шаблон:
Если затем вы измените код, чтобы пропустить каждую вторую точку в шаблоне шахматной доски (пропустить if column % 2 + row % 2 == 1
), вы получите следующий шаблон:
Реализация
Имея в виду эту геометрию, вы можете создать двумерный массив (как с квадратной сеткой), сохраняя x, y
координаты для каждой точки сетки (из первой диаграммы) - что-то вроде этого:
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
Примечание. Как обычно, когда вы создаете сетку вокруг точек (вместо размещения точек в самих точках), вам необходимо сместить начало координат (вычесть половину ширины столбца x
и половину высоты строки из него y
).
Теперь, когда у вас points
инициализирован 2D-массив ( ), вы можете найти ближайшую точку мыши, как на квадратной сетке, только для того, чтобы создать рисунок на второй диаграмме, нужно только игнорировать все остальные точки:
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
Это будет работать, но координаты округляются до ближайшей точки (или без точки) в зависимости от того, в каком невидимом прямоугольнике находится указатель. Вы действительно хотите круглую зону вокруг точки (поэтому диапазон привязки одинаков во всех направлениях). Теперь, когда вы знаете, какую точку проверять, вы можете легко найти расстояние (используя теорему Пифагора). Подразумеваемый круг все равно должен помещаться внутри исходного ограничивающего прямоугольника, ограничивая его максимальный диаметр шириной столбца (четверть ширины плитки), но он все еще достаточно велик, чтобы хорошо работать на практике.