【问题标题】:How to know if two sets of points have same pattern如何知道两组点是否具有相同的模式
【发布时间】:2020-06-17 10:52:24
【问题描述】:

我在 3D 中有 2 组点具有相同的计数,我想知道它们是否具有相同的模式,我想我可以将它们投影在 XZ、XY 和 YZ 平面上,然后比较每个平面上的投影,但我是不知道该怎么做,我认为凸包可能会有所帮助,但它并不准确。 有没有简单的算法来做到这一点?复杂性不是大问题,因为点数很少,我用 Java 实现。

我可以用相同的算法直接在 3D 中解决这个问题吗?

所附图片显示了我的意思的示例。

编辑: 不保证订单。 没有比例,只有旋转和平移。

【问题讨论】:

  • 如果点被相应编号,那么在您的图片中,点 1 将位于左侧面板的顶部和右侧面板的底部等等,这可以被视为一个 procrustes 问题,例如见en.wikipedia.org/wiki/Procrustes_analysis
  • 允许哪些类型的翻译?一个可以比另一个大吗?一个可以成为另一个的镜子吗?点数确实是一样的,还是没有这样的保证?
  • @trincot 它们大小相同,没有比例,只有平移和旋转
  • 所以不允许镜像?另一个问题(点顺序)呢?
  • @trincot 不保证订单,可能相同或不同

标签: algorithm computational-geometry similarity


【解决方案1】:

如果您有一个具有不同形状和运动的固定对象,成对或多重匹配对您来说可能是一个有用的解决方案。例如参见this paper。这种方法也可以扩展到更高的维度。

如果您有两组来自不同对象的不同点并且您发现它们之间的相似性,一种解决方案可以是在两组点中计算discrete Frechet distance,然后比较它们的值。

另一个相关概念是形状重建。您可以将适当的形状重建算法的结果与之前的两种方法混合来计算相似度:

【讨论】:

  • 我觉得很复杂,可能有更简单的算法?
  • @MohamedMoussa 因此,您应该更加具体。请详细说明您的问题并更新您的帖子。
  • 我只需要知道这两组是否有相同的图案/形状
【解决方案2】:

我会收集有关每个点的一些信息:仅取决于“形状”的信息,而不取决于实际的平移/旋转。例如,它可以是该点与形状的任何其他点之间的所有距离的总和。或者它可能是任何两点之间的最大角度,从所考虑的点看。选择任何能带来最大多样性的指标。

然后按该指标对点进行排序。

对两组点执行上述操作。

作为第一步,您可以按已排序的指标列表比较这两个组。允许一点误差范围,因为您将处理浮点精度限制。如果它们不能相互映射,则中止算法:它们是不同的形状。

现在平移点集,以便将有序列表中的第一个点映射到原点 (0, 0, 0),即从组中的所有点中减去第一个点。

现在围绕 Y 轴旋转点集,使有序列表中的第二个点与 XY 平面重合。围绕 Z 轴旋转点集,使该点与 X 轴重合:它应该映射到 (d, 0, 0),其中 d 是第一个和第二个之间的距离点在排序列表中。

最后,围绕X轴旋转点集,使有序列表中的第三个点与XY平面重合。如果该点与之前的点共线,您需要继续对下一个点执行此操作,直到您旋转了一个非共线点。

对两组点执行此操作。然后比较两个列表的转换坐标。

这是主要算法,但我省略了两个点的度量值相同的情况,因此排序列表可以在不破坏排序顺序的情况下进行排列:

在这种情况下,您需要在排序列表的开头使用这些等值点的不同排列执行上述转换,只要不适合。

此外,在检查拟合时,您应该考虑到匹配点的顺序可能与其他组的排序列表中的顺序不同,并且您还应该验证具有相同度量的下一个点。

【讨论】:

  • “按指标排序”的方法很有趣。如果坐标有噪声,也应该尝试接近值的排列。
猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 2021-12-22
  • 2017-09-12
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多