Znalazłem proste, alternatywne podejście, które wykorzystuje tę samą logikę, co zwykła szachownica. Tworzy efekt przyciągania do siatki z punktami pośrodku każdego kafelka i każdego wierzchołka (tworząc ściślejszą siatkę i ignorując przemienne punkty).
To podejście działa dobrze w grach takich jak Catan, w których gracze wchodzą w interakcję z kafelkami i wierzchołkami, ale nie nadaje się do gier, w których gracze tylko wchodzą w interakcje z kafelkami, ponieważ zwraca to, który punkt środkowy lub wierzchołek są najbliższe, a nie który sześciokąt współrzędne są w środku.
Geometria
Jeśli umieścisz punkty na siatce z kolumnami o ćwiartce szerokości kafelka i rzędami o połowę wysokości kafelka, otrzymasz następujący wzór:
Jeśli następnie zmodyfikujesz kod, aby pomijał każdą sekundę kropki we wzorze szachownicy (pomijanie if column % 2 + row % 2 == 1
), otrzymujesz następujący wzór:
Realizacja
Mając na uwadze tę geometrię, możesz utworzyć tablicę 2D (podobnie jak w przypadku kwadratowej siatki), przechowując x, y
współrzędne dla każdego punktu na siatce (z pierwszego schematu) - coś takiego:
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
Uwaga: Jak zwykle, gdy tworzysz siatkę wokół punktów (zamiast umieszczania kropek w samych punktach), musisz przesunąć początek (odejmując połowę szerokości kolumny od x
i połowę wysokości rzędu y
).
Po points
zainicjowaniu tablicy 2D ( ) możesz znaleźć najbliższy punkt myszy, tak jak na kwadratowej siatce, tylko ignorując każdy inny punkt, aby utworzyć wzór na drugim diagramie:
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
To zadziała, ale współrzędne są zaokrąglane do najbliższego punktu (lub żadnego punktu) na podstawie tego, w którym niewidocznym prostokącie znajduje się wskaźnik. Naprawdę chcesz mieć okrągłą strefę wokół punktu (aby zasięg był równy w każdym kierunku). Teraz, gdy wiesz, który punkt sprawdzić, możesz łatwo znaleźć odległość (używając twierdzenia Pitagorasa). Implikowany okrąg nadal musiałby zmieścić się w oryginalnym prostokącie ograniczającym, ograniczając jego maksymalną średnicę do szerokości kolumny (ćwiartka szerokości płytki), ale wciąż jest wystarczająco duży, aby działał dobrze w praktyce.