繁体   English   中英

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

[英]What is the fastest algorithm to find the point from a set of points, which is closest to a line?

我有:
- 一组已知大小的点(在我的情况下,只有6分)
- 由x = s + t * r表征的线,其中x,s和r是3D矢量

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

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

还有一件事:所有数字都是整数(点的坐标和s和r向量的元素)。 同样,出于性能原因,我希望将浮点数学保持在最低限度。

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

由于您不关心实际距离,我们可以对点距离计算进行一些简化。 确切的距离由( 来源 )计算:

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

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

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

比较近似的平方距离并保持最小值。 这个公式的优点是你可以用整数做所有事情,因为你提到所有坐标都是整数。

我恐怕你无法逃脱计算少于6个距离(如果可以的话,至少有一个点会被遗漏 - 包括最近的一个)。

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

由于积分很少,因此这是您的瓶颈是值得怀疑的。 测量热点的位置,重新设计算法/数据表示,增加编译器优化,编译到汇编和烧伤。 严格按此顺序。

Jon Bentley的“写作高效节目”(遗憾的是已经绝版)和“编程珍珠”(第2版)充满了对实用节目的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM