Tenemos un latice hexagonal:¿cuál es la mejor manera de representar latice hexagonal
_ _ _
/\_/ \_/ \_
\_/ \_/ \_/ \
/\_/ \_/ \_/
\_/ \_/ \_/
¿Cuál es la mejor manera de representar con 2 dimensiones matriz o lo que sea
Tenemos un latice hexagonal:¿cuál es la mejor manera de representar latice hexagonal
_ _ _
/\_/ \_/ \_
\_/ \_/ \_/ \
/\_/ \_/ \_/
\_/ \_/ \_/
¿Cuál es la mejor manera de representar con 2 dimensiones matriz o lo que sea
La forma más sencilla de representar una la cuadrícula hexagonal con una matriz 2D es sesgar los ejes: cada fila de hexágonos se compensa medio paso más que la anterior. No importa si cada fila se desplaza hacia delante o hacia atrás, siempre que sea coherente al respecto; a continuación, cada fila sucesiva se compensa la mitad de un hexágono hacia adelante:
(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
Es fácil determinar los vecinos más cercanos de cualquier hexágono dado: en el caso anterior, para una dirección de matriz dada (r,s)
, usted tiene:
(r-1, s)
(r-1, s+1)
(r, s-1)
(r, s+1)
(r+1, s-1)
(r+1, s)
Además, tenga en cuenta que el dibujo ubicación es simple: el centro del hexágono (r,s)
anterior es en la ubicación de la pantalla:
x= dx * (s + 0.5*r)
y= dy * r
Como alternativa, puede compensar filas alternativas por medio hex absoluto. Esto le dará una forma más rectangular para una matriz determinada, pero determinar la ubicación del dibujo y los vecinos más cercanos requeriría dos casos, para las filas pares e impares, respectivamente.
Existen otros sistemas de coordenadas disponibles, pero son menos conveniente y más oscura ...
Dado que el PO quiere más, voy a añadir un enlace a mi sistema de indexación hexagonal oscura favorita: una "spiral honeycomb mosaic". Este utiliza un sistema de base y siete para indexar sucesivamente más grandes grupos "super-hexágono" de ubicaciones hexagonales, como sigue (en cuenta que está marcado en la base-7, no de base diez):
7 elements: 49 elements:
2 3
22 23
1 0 4 -->
12 13 21 20 24
6 5
11 10 14 26 25 32 33
16 15 02 03 31 30 34 --> [3 base-7 digits
-> 343 elements...]
62 63 01 00 04 36 35
61 60 64 06 05 42 43
66 65 52 53 41 40 44
51 50 54 46 45
56 55
El enlace tiene algún código para tratar con este sistema de coordenadas, pero realmente no he intentado evaluarlo ...
su solución en realidad no representa el enrejado que se muestra en la respuesta; se rota 90 grados. el enrejado de la pregunta no tiene vecinos directamente horizontales, pero sí tiene los verticales. –
@andrew cooke: ¿De verdad? sentirse un poco exigente hoy ¿verdad? :-) Probablemente fue más fácil dibujar la imagen en ascii. Uno ciertamente puede intercambiar los roles de rys e invertir la imagen ... – phkahler
Estaba pensando r = rows y s = skewed-columns; La convención de matriz estilo C generalmente es A [fila] [columna] de todos modos. Por supuesto, como dice phkahler, puedes dibujarlo como quieras ... – comingstorm
Un 2d matriz está bien usando 2 filas = 1 altura hex, y 1 columna = 1 ancho hex.
4,1,5,2,6,3
4,7,5,8,6,9
A,7,B,8,C,9
A,D,B,E,C,F
¡gracias! ¡Eso es muy inusual! – Eugeny89
Otra forma de pensar sobre este patrón es: tomar un enrejado cuadrado y soltar la mitad de las coordenadas según la paridad (por ejemplo, solo aceptar/usar esas coordenadas '(x, y)' de modo que 'x + y' sea par). Por supuesto, no desea perder la mitad de las entradas de la matriz, por lo tanto, el acuerdo de @ LastCoder anterior. – comingstorm
¿Le interesa nodos o las zonas? –
¿qué estás buscando representar? un enrejado infinito? ¿un enrejado finito de forma rectangular? datos en los vértices? datos en los bordes? –
Ver [Un hexágono inclinado] (http://ferkeltongs.livejournal.com/31455.html) y [Pensamientos de Amit en las grillas] (http://www-cs-students.stanford.edu/~amitp/game-programming/grids /) –