Search for neighboring neighbors in a hexagonal grid

EDIT: Wrapped an example map in a code block so that the formatting is correct.

Ok, I'm trying to write an extremely simple A * algorithm over a hexagonal grid. I understand, and can do part A *. In fact, my A * works for square grids. What I canโ€™t wrap my brain around is to find neighbors with hexagons. Here is the layout for the grid with the grid

0101 0301 0201 0401 0102 0302 0202 0402 

etc.

So, I need help writing the Hexagon class, which, given its hexadecimal coordinates, can generate a list of neighbors. It should be able to generate neighbors who โ€œpiledโ€ the grid (for example, 0000 or 2101 in a 20x20 grid), because this is how my A * track several cards located side by side. So, something that will work with this piece of code:

planet = Hex ('0214') print (planet.neighbors ()) ['Hex 0213', 'Hex 0215', 'Hex 0115', 'Hex 0315', 'Hex 0116', 'Hex 0316']

+8
python grid tiles hexagonal-tiles
source share
2 answers

It depends on how you determine the coordinates of your hexagonal plates.

We'll see.

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

In this case, the definition of a neighbor for odd and even lines is different.

For the cell (X, Y), where Y is even, the neighbors: (X, Y-1), (X + 1, Y-1), (X-1, Y) (X + 1, Y) (X, Y + 1), (X + 1, Y + 1)

For cell (X, Y), where Y is odd, neighbors: (X-1, Y-1), (X, Y-1), (X-1, Y) (X + 1, Y) (X-1 , Y + 1), (X, Y + 1)

+6
source share

In my comment above, here is the code I implemented. Anyone who has suggestions to help me clean it, I would welcome feedback.

 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 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() 
+2
source share

All Articles