Нахождение соседних соседей по шестиугольной сетке - PullRequest
10 голосов
/ 12 июля 2011

РЕДАКТИРОВАТЬ: обернуть карту примера в блок кода, чтобы форматирование было правильным.

Хорошо, я пытаюсь написать чрезвычайно простой алгоритм A * по гексагональной сетке. Я понимаю, и могу сделать часть A *. Фактически, мой A * работает для квадратных сеток. Что я не могу обернуть вокруг себя, так это найти соседей с шестиугольниками. Вот макет для гексагональной сетки

0101     0301
    0201      0401
0102     0302
    0202      0402

и т. Д. И т. П.

Итак, мне нужна помощь в написании класса Hexagon, который, учитывая его шестнадцатеричные координаты, может генерировать список соседей. Он должен иметь возможность генерировать соседей, которые «падают» с сетки (например, 0000 или 2101 в сетке 20x20), потому что именно так мой A * отслеживает несколько карт, расположенных рядом. Итак, кое-что, что будет работать с этим фрагментом кода:

planet = Hex ('0214') печать (planet.neighbors ()) ['Hex 0213', 'Hex 0215', 'Hex 0115', 'Hex 0315', 'Hex 0116', 'Hex 0316'] * ​​1010 *

Ответы [ 2 ]

7 голосов
/ 12 июля 2011

Это зависит от того, как вы определяете координаты ваших шестнадцатеричных плиток.

Посмотрим.

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

В этом случае определение соседей отличается для четных и нечетных строк.

Для ячейки (X, Y), где Y четное, соседи: (X, Y-1), (X + 1, Y-1), (X-1, Y) (Х + 1, Y) (X, Y + 1), (X + 1, Y + 1 )

Для ячейки (X, Y), где Y нечетно, соседями являются: (Х-1, Y-1), (X, Y-1), (X-1, Y) (Х + 1, Y) (Х-1, Y + 1), (X, Y + 1 ) * +1010 *

2 голосов
/ 17 июля 2011

На мой комментарий выше, вот код, который я реализовал.Кто-нибудь с предложениями, чтобы помочь мне очистить его, я буду рад обратной связи.

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()
...