我有:
-一组已知大小的点(在我的情况下,只有6点)
-以x = s + t * r为特征的直线,其中x,s和r为3D向量
我需要找到最接近给定线的点。实际距离对我来说无关紧要。
我看了看似相关的几个不同问题(包括this),并且从中学数学课上知道如何在纸上解决这个问题。但是,如果不计算出每个距离,我将找不到解决方案,而且我相信必须有更好/更快的方法。在我的应用程序中,性能绝对至关重要。
另一件事:所有数字都是整数(点的坐标以及s和r向量的元素)。同样,出于性能方面的考虑,我希望将浮点数保持在最低水平。
答案 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)的“高效书面程序”(很久以来已经绝版)和“编程珍珠”(第二版)对实用编程提出了很多建议。