获得形状的独特散列,与其旋转,镜像或位置无关

时间:2013-12-12 10:56:29

标签: algorithm graph-algorithm

上下文

我正在创建一个迷宫发生器(实际上,更像是地图生成器),基于“腔室”想要相互连接。我从文本文件中读取这些内容,然后转换为由LocatedNodes组成的内部格式,它们基本上是节点类型和x-y坐标。我在NodeList中重新组合它们,我将所有函数旋转/镜像/规范化这些节点。 Map是一个腔室的集合,因此它只有一个NodeList包含这些。

总结层次结构:Map< - NodeList< - locatedNodes

问题

为了连接腔室,我比较第一张地图的开口的形状和第二张地图的开口周围的区域的形状。让我们从一个例子开始:

>>> print map6.nodes # nodes of the entire map
              1 1
    0    5    0 2
   o⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
 0 |#############
   |#...........#
   |#...........#
   |#...........#
   |#............
 5 |#............
   |#........    
   |#........    
   |#........    
   |#........    
10 |#########    

>>> print map6.openings() # just the nodes placed on the opening
       1
   8   2
  o⎯⎯⎯⎯⎯
4 |    .
  |.....
  |.    
  |.    
  |.    
9 |. 

>>> print map7.nodes # map we want to connect with the other
             1   1
   0    5    0   4
  o⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
0 |    ###########
  |    ..........#
  |    ..........#
  |..............#
  |..............#
5 |..............#
  |..............#
7 |###############

>>> print map7.joinable_on() # area around the map7.openings()
   -
   1   3
  o⎯⎯⎯⎯⎯
1 |    .
  |.....
  |.    
  |.    
  |.    
6 |. 

>>> map7.joinable_on().normalized(x=0,y=0) == map6.openings().normalized(x=0, y=0)
True

比较map6.openings()和map7.joinable_on()并不难,因为当节点的位置标准化时,我可以进行一对一的比较。

但是,困难的部分现在来了: 我希望能够独立于它们的位置,旋转或镜像来比较这些形状。

我尝试了什么

在搜索想法时,我发现pairing function(此函数将两个int链接到唯一的int,因此每个坐标x-y成为唯一的int)。通过这种方式,我可以通过在(x,y)坐标上递归地应用此函数来唯一地识别形状。第一个问题,唯一的int是非常独特的,所以即使旋转90°,int也会发生变化,所以我不能用这种方式比较两种形状。

问题

你是否有一个想法或解决方案来帮助我获得一个形状的唯一ID,当这个形状被镜像,翻译或旋转时不会改变?

2 个答案:

答案 0 :(得分:1)

有一种通用方案可用于创建在镜像,平移或旋转形状时不会更改的ID。从一个关心镜像,翻译和旋转的id开始。获得形状时,请考虑每个可能的镜像,旋转和平移,并为每个案例计算一个id。这为您提供了大量的ID,因此只需选择数字最小的ID。

对于翻译的情况,另一个想法可能更实用 - 在完成所有这些之前(和/或之后),翻译形状以使其重心位于原点,或尽可能接近原点做到这一点。

答案 1 :(得分:1)

好像你应该有没有平移,旋转或镜像的形状列表。然后,要创建地图,您可以为形状编制索引并提供变换矩阵。所以你的输入文件看起来像:

Shapes
    shape1
    shape2
    shape3
    etc.

这些形状都是在原点建造的,没有翻译。

然后,您的地图变为:

Map
    0 (index to shape1), transformation matrix (scaling, rotation, translation, mirroring)
    2 (index to shape3), transformation matrix
    0 (index to shape1), different transformation matrix

然后你需要做的就是确定地图中的两个形状是否相同才能比较它们的索引。