2011-07-12 20 views
8

EDITAR: Envolvió el mapa de ejemplo en un bloque de código para que el formato sea correcto.Encontrar vecinos adyacentes en una cuadrícula hexagonal

Ok, estoy tratando de escribir un algoritmo A * extremadamente simple sobre una cuadrícula hexagonal. Entiendo, y puedo hacer la parte A *. De hecho, mi A * funciona para cuadrículas cuadradas. Lo que no puedo envolver mi cerebro es encontrar vecinos con hexágonos. Aquí está el diseño de la rejilla heagonal

0101  0301 
    0201  0401 
0102  0302 
    0202  0402 

etc, etc

lo tanto, lo que necesito ayuda está escribiendo una clase hexagonal que, dado que es coordenadas hexagonales, puede generar una lista de vecinos. Tiene que ser capaz de generar vecinos que se "caigan" de la red (como 0000 o 2101 en una grilla de 20x20) porque así es como mis pistas A * en varios mapas colocados uno al lado del otro. Así que algo que funcione con este fragmento de código:

planeta = Hex ('0214') de impresión (planet.neighbors()) [ 'Hex 0213', '0215 Hex', 'Hex 0115', 'Hex 0315 ',' Hex 0116 ',' Hex 0316 ']

+0

que he proporcionado una respuesta a esta misma pregunta se encuentra aquí: http://stackoverflow.com/a/15524441/2135355 –

Respuesta

6

Depende de cómo definas las coordenadas de tus teselas hexagonales.

Veamos.

, , , , 
/\/\/\/\ 
| A1| A2| A3| A4| 
\/\/\/\/
    | B1| B2| B3| 
/\/\/\/\ 
| C1| C2| C3| C4| 
\/\/\/\/
    ' ' ' ' 

En este caso, la definición de vecino es diferente para las filas pares e impares.

Para una celda (X, Y) donde Y es par, los vecinos son: (X, Y-1), (X + 1, Y-1), (X-1, Y), (X + 1, Y), (X, Y + 1), (X + 1, Y + 1)

Para una celda (X, Y) donde Y es impar, los vecinos son: (X-1, Y-1), (X, Y-1), (X-1, Y), (X + 1, Y), (X-1, Y + 1), (X, Y + 1)

+0

Ok, creo que estoy siguiendo. Este realmente me está volviendo loco, y lo he estado reflexionando durante bastante tiempo. ¿Puedes echar un vistazo a mi bonito ejemplo de formato? – Jonathanb

+0

Veo, es muy similar, mis fichas son "verticales" y las tuyas son "horizontales", simplemente intercambia X con Y, y piensa en columnas en lugar de filas. –

+0

Gracias. En este momento estoy mal, pero tan pronto como obtenga el código escrito, lo publicaré como un comentario debajo de esta respuesta en caso de que otras personas necesiten ayuda similar. Simplemente no pude superar la barrera conceptual ... – Jonathanb

2

Según mi comentario anterior, aquí está el código que implementé. Alguien con sugerencias para ayudarme a limpiarlo, agradecería los comentarios.

class Hexagon(): 
"""Implements a class of hexagon from a hex map which is vertically tiled. 
This hexagon is able to return a list of it's neighbors. It does not care 
if the neighbors are hexes which actually exist on the map or not, the map is 
responsible for determining that.""" 

def __init__(self,grid_number): 
    self.name = grid_number 
    self.x = int(grid_number[0:2]) 
    self.y = int(grid_number[2:4]) 

def neighbors(self): 
    ret_list = [] 
    if self.x % 2 == 0: 
     temp_list = [[self.x,self.y-1], 
       [self.x-1,self.y], [self.x+1,self.y], 
       [self.x-1,self.y+1],[self.x+1,self.y+1], 
        [self.x,self.y+1]] 
     for i in temp_list: 
      ret_list.append(format(i[0],'02d') + format(i[1],'02d')) 

    elif self.x % 2 == 1: 
     temp_list = [[self.x,self.y-1], 
       [self.x-1,self.y-1],[self.x+1,self.y-1], 
       [self.x-1,self.y],[self.x+1,self.y], 
        [self.x,self.y+1]] 
     for i in temp_list: 
      ret_list.append(format(i[0],'02d') + format(i[1],'02d')) 

    return ret_list 

def main(): 
    hex1 = Hexagon('0201') 
    hex2 = Hexagon('0302') 
    if hex1.neighbors() == ['0200','0101','0301','0102','0302','0202']: 
     print("Works for even columns.") 
    else: 
     print("Failed for even columns.") 
     print(hex1.neighbors()) 

    if hex2.neighbors() == ['0301','0201','0401','0202','0402','0303']: 
     print("Works for odd columns.") 
    else: 
     print("Failed for odd columns.") 
     print(hex2.neighbors()) 

if __name__ == '__main__': 
    main() 
Cuestiones relacionadas