41 votos

Sistema de coordenadas hexagonales

Si tuviera una cuadrícula de cuadrados, se pueden etiquetar con coordenadas cartesianas tales que dado un cuadrado $(x,y)$ sabes que comparte un límite con cuadrados $(x+1,y),(x-1,y),(x,y+1),(x,y-1)$ .

¿Existe alguna forma de etiquetar una cuadrícula de hexágonos teselados de modo que, dada la etiqueta de cualquier hexágono, se pueda averiguar cuáles son sus vecinos?

56voto

Joshua Kidd Puntos 141

En aras de cerrar la pregunta he publicado esta respuesta, pero todo el crédito por la respuesta va a Michael Lugo por su comentario en mi post inicial.

Toda la información procede de este enlace. Entra en muchos más detalles que esta respuesta.

Existen múltiples enfoques para etiquetar las cuadrículas Hexagon, cada uno con ventajas e inconvenientes.

Coordenadas de desplazamiento

Lo más habitual es compensar cada dos columnas o filas. Las columnas se denominan col o q. Las filas se denominan row o r. Se puede desplazar el impar o las columnas/filas pares, por lo que los hexágonos horizontales y verticales tienen cada uno dos variantes.

Offset coordinates, horizontal layout

Coordenadas del cubo

Otra forma de ver las cuadrículas hexagonales es que hay tres ejes primarios, a diferencia de los dos que tenemos para las cuadrículas cuadradas. Hay una elegante simetría con éstas.

enter image description here

En lugar de tener dos valores por coordenada, que representan la distancia al Norte y al Sur del hexágono, puede utilizar tres dimensiones.

Coordenadas axiales

El sistema de coordenadas axiales, a veces llamado "trapezoidal", se construye tomando dos de las tres coordenadas de un sistema de coordenadas cúbicas. Dado que tenemos una restricción como x + y + z = 0, la tercera coordenada es redundante. Las coordenadas axiales son útiles para almacenar mapas y para mostrar coordenadas al usuario. Al igual que las coordenadas cúbicas, puede utilizar las operaciones estándar de sumar, restar, multiplicar y dividir de las coordenadas cartesianas.

enter image description here

Así que para mis propósitos, el sistema de mapas más útil eran las coordenadas cúbicas, ya que tienen las reglas más simples y consistentes para cambiar las coordenadas basadas en el movimiento entre celdas.

5voto

Konchog Puntos 111

Aunque yo utilizo la página de hexágonos de redblobgames para todo tipo de cosas hexagonales, existe una "otra forma" sencilla, muy similar al cálculo del vecino cartesiano. La forma normal en que imaginamos los ladrillos (unión en camilla) tiene la misma relación que una retícula hexagonal.
Teniendo en cuenta que los ladrillos de cada dos filas tienen un desplazamiento horizontal, contamos (a lo largo de las filas) utilizando incrementos de +2 en lugar de +1.

Esto nos da los siguientes valores x

3:0 2 4 6 8
2: 1 3 5 7
1:0 2 4 6 8
0: 1 3 5 7
  012345678

Mientras que los valores y son los mismos que los cartesianos. Ahora podemos calcular nuestros vecinos:

Para cualquier ladrillo/hex (x, y) donde (x+y)%2==1 los vecinos son (x-2,y),(x+2,y),(x-1,y+1),(x+1,y+1),(x-1,y-1),(x+1,y-1)

La colocación de un hexágono (x,y) en una posición cartesiana aproximada puede hacerse mediante (x+y%2,y) (donde % es la operación de módulo)

Si queremos etiquetar sin utilizar incrementos de +2, aún podemos hacerlo, pero necesitamos utilizar la operación módulo para calcular los vecinos.

3:0 1 2 3 4
2: 1 2 3 4
1:0 1 2 3 4
0: 1 2 3 4
  0-1-2-3-4 y%2=1
  -1-2-3-4- y%2=0

Ahora podemos resolver lo de nuestros vecinos: Para cualquier ladrillo/hex (x, y) los vecinos son (x-1,y),(x+1,y),(x,y+1),(x+2(y%2)-1,y+1),(x,y-1),(x+2(y%2)-1,y-1).

-2voto

Mark Butler Puntos 1

Crea la cuadrícula trazando líneas horizontales a través de TODOS los centros de los hexágonos y líneas verticales a través de TODOS los centros de los hexágonos. Los vecinos son:

(+1,-1), (+2,0), (+1,+1), (-1,+1), (-2,0), (-1,-1)

Nota: el eje x está escalado por un factor sqrt(3). Esto está bien. Las coordenadas cartesianas pueden tener un eje escalado.

Nota: la x,y no coincide con la etiqueta del hexágono. No pasa nada.

Si fijamos el hexágono superior izquierdo con una coordenada de (0,0), la etiqueta del hexágono es: Math.floor(x/2)+1 más y+1

(0,0) => 0101 (2,0) => 0201 (4,0) => 0301 (1,1) => 0102 (3,1) => 0202 (5,1) => 0302

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X