Algorithm 获取形状的唯一散列,该散列与形状的旋转、镜像或位置无关

Algorithm 获取形状的唯一散列,该散列与形状的旋转、镜像或位置无关,algorithm,graph-algorithm,Algorithm,Graph Algorithm,上下文 我正在创建一个迷宫生成器(实际上,更像是一个地图生成器),它基于希望相互连接的“chambers”。我从文本文件中读取这些内容,然后将其转换为由LocatedNodes组成的内部格式,这些节点基本上是节点类型和x-y坐标。我在NodeList中重新组合了它们,在这里我放置了所有用于旋转/镜像/规范化这些节点的函数。 Map是腔室的集合,因此它有一个包含这些腔室的NodeList 总结层次结构:Map有一个创建ID的通用方案,当镜像、平移或旋转形状时,ID不会改变。从一个关心镜像、平移和旋

上下文

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


总结层次结构:Map有一个创建ID的通用方案,当镜像、平移或旋转形状时,ID不会改变。从一个关心镜像、平移和旋转的id开始。当您得到形状时,考虑每一种可能的镜像、旋转和平移,并计算每种情况下的ID。这将提供大量ID,因此只需选择数值最小的ID即可


对于平移的情况,另一个想法可能更为实用——在执行所有这些操作之前(和/或之后),平移形状,使其重心位于原点,或尽可能靠近原点。

似乎您应该拥有一个没有平移、旋转或镜像的形状列表。然后,要创建贴图,请为形状编制索引并提供变换矩阵。因此,您的输入文件看起来像:

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
然后,要确定贴图中的两个形状是否相同,只需比较它们的索引即可

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