Echa un vistazo a esta foto
Como puede ver, hay una forma relativamente intuitiva de mapear el sistema de coordenadas rectangulares x, y al hexagonal.
Podemos hablar de hexágonos irregulares "rect", es decir, hexágonos inscritos en elipses o hexágonos obtenidos de hexágonos regulares escalados en ambas direcciones de manera desproporcionada (sin rotaciones-cizallas).
Un hexágono rectángulo puede definirse por la altura y el ancho del rectángulo circunscriptor más el ancho del rectificador. (W, w, h)
La forma más fácil de averiguar el índice hexagonal es dividir el espacio de la siguiente manera:
El ancho del rectángulo es w + (W - w) / 2 = (w + W) / 2, su altura es h / 2; El ancho del rectángulo verde es (Ww) / 2. Es fácil averiguar en qué rectángulo cae el punto:
u y v son las coordenadas de recordatorio que indican dónde está el punto dentro del rectángulo i, j: Usando w podemos decir si estamos en el área verde (u <(Ww) / 2) o no.
si es el caso de que estamos en el área verde, necesitamos saber si estamos en la mitad superior o inferior del hexágono: estamos en la mitad superior si i y j son ambos pares o impares; estamos en la mitad inferior de lo contrario.
En ambos casos es útil transformar u y v para que varíen entre 0 y 1:
si estamos en la mitad inferior y v <u
o
si estamos en la mitad superior y (1-v)> u
entonces decrementamos i por uno
Ahora simplemente tenemos que disminuir j por uno si i es extraño para ver que i es el índice del hexágono horizontal (columna) y la parte entera de j / 2 es el índice del hexágono vertical (fila)
Los hexágonos regulares tienen seis ejes de simetría, pero supongo que sus hexágonos solo tienen dos ejes de simetría ( es decir, todos los ángulos no son exactamente 60 grados). No necesariamente porque el tuyo no tiene la simetría completa, sino porque puede ser útil para otra persona.
Aquí están los parámetros de un hexágono. Su centro está adentro
O
, el ancho más grande es2a
, la altura es2b
y la longitud del borde superior es2c
.Este es el diseño de fila / columna, con el origen en el centro del hexágono inferior izquierdo. Si su configuración es diferente, traduzca sus
(x,y)
coordenadas para recurrir a este caso, o use en-y
lugar de,y
por ejemplo:El siguiente código le dará la fila y la columna del punto que contiene el hexágono
(x,y)
:Puede comprobar que el código anterior dibuja hexágonos perfectos en esta ejecución de IdeOne .
fuente
Podrías colocar 3 rectángulos rotados dentro del área del hexágono, y si se hace correctamente, llenaría el área exactamente. Entonces sería simplemente una cuestión de verificar la colisión en los tres rectángulos.
fuente
Probablemente no necesite cancelar el registro de clics entre los mosaicos. Es decir, no dolerá e incluso podría ayudar al jugador si permite que se haga clic en los espacios entre las fichas a menos que esté hablando de un gran espacio entre ellos que está lleno de algo que lógicamente no debería hacer clic (Digamos, los hexes son ciudades en un mapa grande donde entre ellos hay otras cosas que se pueden hacer clic como personas)
Para hacer lo anterior, simplemente puede trazar los centros de todos los hexes, y luego encontrar el más cercano al mouse cuando se hace clic en el plano de todos los hexes. El centro más cercano en un plano de hexágonos teselados siempre será el mismo sobre el que se desplaza.
fuente
Ya he respondido una pregunta similar, con objetivos idénticos, en Stack Overflow , la volveré a publicar aquí para mayor comodidad: (Nota: todo el código está escrito y probado en Java)
Esta imagen muestra la esquina superior izquierda de una cuadrícula hexagonal y superpuesta es una cuadrícula cuadrada azul. Es fácil encontrar en cuál de los cuadrados hay un punto dentro y esto también daría una aproximación aproximada de cada hexágono. Las porciones blancas de los hexágonos muestran dónde el cuadrado y la cuadrícula hexagonal comparten las mismas coordenadas y las porciones grises de los hexágonos muestran dónde no.
La solución ahora es tan simple como encontrar en qué cuadro se encuentra un punto, luego verificar si el punto está en cualquiera de los triángulos y corregir la respuesta si es necesario.
En este punto, tenemos la fila y la columna de la caja en la que se encuentra nuestro punto, luego debemos probar nuestro punto contra los dos bordes superiores del hexágono para ver si nuestro punto se encuentra en cualquiera de los hexágonos anteriores:
Tener coordenadas relativas facilita el siguiente paso.
Al igual que en la imagen de arriba, si la y de nuestro punto es > mx + c , sabemos que nuestro punto se encuentra por encima de la línea y, en nuestro caso, el hexágono arriba ya la izquierda de la fila y columna actuales. Tenga en cuenta que el sistema de coordenadas en Java tiene y comenzando en 0 en la parte superior izquierda de la pantalla y no en la parte inferior izquierda, como es habitual en matemáticas, de ahí el gradiente negativo utilizado para el borde izquierdo y el gradiente positivo utilizado para la derecha.
Una explicación rápida de las variables utilizadas en el ejemplo anterior:
m es el gradiente, entonces m = c / halfWidth
La adición de NeoShamam a lo anterior
Esta es una adición a la respuesta de Sebastian Troy. Lo dejaría como un comentario, pero todavía no tengo suficiente reputación.
Si desea implementar un sistema de coordenadas axiales como se describe aquí: http://www.redblobgames.com/grids/hexagons/
Puede hacer una ligera modificación al código.
En lugar de
utilizar esta
Esto hará que la coordenada (0, 2) esté en la misma columna diagonal que (0, 0) y (0, 1) en lugar de estar directamente debajo de (0, 0).
fuente
Si todos sus hexágonos están hechos con las mismas proporciones y ubicación, podría usar algún tipo de recurso de superposición para las colisiones, algo así como:
Luego, todo lo que tiene que hacer es colocar la imagen de colisión donde está su hexágono, obtener la posición del mouse con respecto a la esquina izquierda y ver si el píxel de la posición relativa NO es blanco (lo que significa que hay una colisión).
Código (no probado):
Obviamente, podría realizar una verificación de colisión de rectángulo de antemano (de toda su imagen hexagonal) para mejorar el rendimiento de todo el proceso.
El concepto es bastante simple de entender e implementar, pero solo funciona si sus hexágonos son todos iguales. También podría funcionar si solo tiene un conjunto de dimensiones hexagonales posibles, lo que significaría que necesitaría más de una superposición de colisión.
Si considera que es una solución muy simple para lo que podría ser mucho más completo y reutilizable (usando las matemáticas para encontrar realmente la colisión), pero definitivamente vale la pena intentarlo en mi opinión.
fuente
Hay un artículo sobre Game Programming Gems 7 llamado For Bees and Gamers: How to Handle Hexagonal Tiles que sería exactamente lo que necesita.
Desafortunadamente no tengo mi copia del libro conmigo en este momento, de lo contrario podría haberlo descrito un poco.
fuente