从一组最接近直线的点中找到点的最快算法是什么?

时间:2019-06-27 12:31:39

标签: c++ performance linear-algebra computational-geometry

我有:
 -一组已知大小的点(在我的情况下,只有6点)
 -以x = s + t * r为特征的直线,其中x,s和r为3D向量

我需要找到最接近给定线的点。实际距离对我来说无关紧要。

我看了看似相关的几个不同问题(包括this),并且从中学数学课上知道如何在纸上解决这个问题。但是,如果不计算出每个距离,我将找不到解决方案,而且我相信必须有更好/更快的方法。在我的应用程序中,性能绝对至关重要。

另一件事:所有数字都是整数(点的坐标以及s和r向量的元素)。同样,出于性能方面的考虑,我希望将浮点数保持在最低水平。

2 个答案:

答案 0 :(得分:5)

您必须至少处理一次每个点才能知道它们的距离。除非您想用不同的线多次重复该过程,否则不可避免地要简单地计算每个点的距离。因此算法必须为O(n)。

由于您不在乎实际距离,因此我们可以简化点距计算。精确的距离由(source)计算:

d^2 = |r⨯(p-s)|^2 / |r|^2

其中是叉积,|r|^2是向量r的平方长度。由于|r|^2对于所有点都是恒定的,因此我们可以在不更改结果的情况下从距离计算中忽略它:

d^2 = |r⨯(p-s)|^2

比较近似的平方距离并保持最小。该公式的优点是您可以使用整数进行所有操作,因为您提到所有坐标都是整数。

答案 1 :(得分:1)

恐怕您无法完成少于6个距离的计算(如果可以的话,至少会遗漏一个点-包括最近的一个点)。

查看预处理是否有意义:线条是否固定且点是否不同?考虑旋转坐标以使线水平。

由于要点很少,因此这是否是您的瓶颈值得怀疑。 测量热点所在,重新设计算法/数据表示,加速编译器优化,编译为汇编并将其烧毁。严格按此顺序。

乔恩·本特利(Jon Bentley)的“高效书面程序”(很久以来已经绝版)和“编程珍珠”(第二版)对实用编程提出了很多建议。