【问题标题】:Finding adjacent neighbors on a hexagonal grid在六边形网格上查找相邻邻居
【发布时间】:2011-07-12 08:06:42
【问题描述】:

编辑:将示例地图包装在代码块中,以便格式正确。

好的,我正在尝试在六边形网格上编写一个极其简单的 A* 算法。我了解,并且可以做 A* 部分。事实上,我的 A* 适用于方形网格。我无法思考的是寻找带有六边形的邻居。这是 heagonal 网格的布局

0101     0301
    0201      0401
0102     0302
    0202      0402

等等等等

所以,我需要帮助的是编写一个 Hexagon 类,给定它的十六进制坐标,可以生成邻居列表。它需要能够生成会“脱离”网格的邻居(例如 20x20 网格中的 0000 或 2101),因为这就是我的 A* 跟踪并排放置的多个地图的方式。因此,可以使用此代码 sn-p 的东西:

行星 = 十六进制('0214') 打印(行星。邻居()) ['Hex 0213', 'Hex 0215', 'Hex 0115', 'Hex 0315', 'Hex 0116', 'Hex 0316']

【问题讨论】:

标签: python grid tiles hexagonal-tiles


【解决方案1】:

这取决于您如何定义十六进制图块的坐标。

让我们看看。

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

在这种情况下,偶数行和奇数行的邻居定义是不同的。

对于 Y 为偶数的单元格 (X,Y),邻居是: (X,Y-1),(X+1,Y-1),(X-1,Y),(X+1,Y),(X,Y+1),(X+1,Y+1 )

对于 Y 为奇数的单元格 (X,Y),邻居是: (X-1,Y-1),(X,Y-1),(X-1,Y),(X+1,Y),(X-1,Y+1),(X,Y+1 )

【讨论】:

  • 好的,我想我在关注。这个真的让我发疯了,我已经考虑了很长时间了。你能看看我的格式漂亮的例子吗?
  • 我明白了,非常相似,我的图块是“垂直的”,而你的图块是“水平的”,只需将 X 与 Y 交换,并考虑列而不是行。
  • 谢谢。我现在心情不好,但是一旦我真正编写了代码,我就会将其作为评论发布在这个答案下面,以防其他人需要类似的帮助。我只是无法克服概念上的障碍......
  • 太大而无法放入评论中,因此我将其发布为下面的答案。再次感谢您的帮助!
  • @GB:我认为您将 Y == even 和 Y == odd 混淆了。可以查吗?
【解决方案2】:

根据我上面的评论,这是我实现的代码。任何有建议帮助我清理它的人,我都欢迎反馈。

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

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2015-01-08
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多