如何知道两组点是否具有相同的模式

How to know if two sets of points have same pattern

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

中实现

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

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

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

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

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

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

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

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

对两组点都执行上述操作。

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

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

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

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

对两组点都这样做。然后比较两个列表的如此转换的坐标。

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

在这种情况下,您需要对排序列表开头的那些等值点进行不同的排列来执行上述转换,只要没有合适的即可。

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