2011-07-12 44 views
8

EDIT: Đã bọc bản đồ ví dụ vào một khối mã để định dạng đúng.Tìm các láng giềng lân cận trên lưới lục giác

Ok, tôi đang cố gắng viết một thuật toán A * cực kỳ đơn giản trên lưới lục giác. Tôi hiểu, và có thể làm phần A *. Trong thực tế, A * của tôi hoạt động cho lưới vuông. Những gì tôi không thể quấn bộ não của tôi xung quanh là tìm hàng xóm với hình lục giác. Dưới đây là cách bố trí cho lưới điện heagonal

0101  0301 
    0201  0401 
0102  0302 
    0202  0402 

vv, vv

Vì vậy, những gì tôi cần giúp đỡ đang viết một lớp lục giác rằng, cho đó là tọa độ hex, có thể tạo ra một danh sách các nước láng giềng. Nó cần để có thể tạo ra hàng xóm mà sẽ 'rơi ra' lưới (như 0000 hoặc 2101 trong một lưới 20x20) bởi vì đó là cách A * của tôi theo dõi trên nhiều bản đồ đặt cạnh nhau. Vì vậy, thứ gì đó sẽ hoạt động với đoạn mã này:

hành tinh = Hex ('0214') in (planet.neighbors()) ['Hex 0213', 'Hex 0215', 'Hex 0115', 'Hex 0315 ',' Hex 0116 ',' Hex 0316 ']

+0

tôi đã cung cấp một câu trả lời cho câu hỏi cùng này tìm thấy ở đây: http://stackoverflow.com/a/15524441/2135355 –

Trả lời

6

Tùy thuộc vào cách bạn xác định tọa độ của gạch hình lục giác.

Hãy xem.

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

Trong trường hợp này, định nghĩa hàng xóm khác nhau cho các hàng chẵn và lẻ.

Đối với ô (X, Y) trong đó Y là chẵn, các hàng xóm là: (X, Y-1), (X + 1, Y-1), (X-1, Y), (X + 1, Y), (X, Y + 1), (X + 1, Y + 1)

Đối với ô (X, Y) trong đó Y là số lẻ, hàng xóm là: (X-1, Y-1), (X, Y-1), (X-1, Y), (X + 1, Y), (X-1, Y + 1), (X, Y + 1)

+0

Ok, tôi nghĩ rằng tôi sau. Cái này thực sự khiến tôi phát điên, và tôi đã nghiền ngẫm nó trong một thời gian. Bạn có thể xem ví dụ được định dạng đẹp của tôi không? – Jonathanb

+0

Tôi thấy, nó rất giống, gạch của tôi là "dọc" và của bạn là "ngang", chỉ cần trao đổi X với Y, và suy nghĩ cột thay vì hàng. –

+0

Cảm ơn bạn. Tôi đang ở thời tiết ngay bây giờ, nhưng ngay sau khi tôi thực sự nhận được mã viết lên, tôi sẽ đăng nó như một bình luận bên dưới câu trả lời này trong trường hợp những người khác cần sự giúp đỡ tương tự. Tôi chỉ không thể vượt qua rào cản khái niệm .... – Jonathanb

2

Theo nhận xét của tôi ở trên, đây là mã tôi đã triển khai. Bất kỳ ai có đề xuất giúp tôi dọn dẹp, tôi đều hoan nghênh phản hồi.

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() 
Các vấn đề liên quan