从一组最接近直线的点中找到点的最快算法是什么?
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 向量
我需要找到最接近给定线的点。实际距离对我来说无所谓。
我看了几个看起来相关的不同问题(包括 this 一个),并且知道如何从我的高中数学中解决这个问题 类。但是我无法在不计算每个距离的情况下找到解决方案,而且我确信必须有一种 better/faster 方式。性能在我的应用程序中绝对至关重要。
还有一件事:所有数字都是整数(点的坐标以及 s 和 r 向量的元素)。同样,出于性能原因,我想将浮点数学运算保持在最低限度。
恐怕你无法计算少于 6 个距离(如果可以,至少会遗漏一个点 -- 包括最近的一个点)。
看看预处理是否有意义:线是固定的,点是变化的吗?考虑旋转坐标使线水平。
由于点数少,怀疑是不是你的瓶颈。 测量 热点所在的位置,重新设计 algorithms/data 表示,加强编译器优化,编译为汇编并将其烧毁。严格按照这个顺序。
Jon Bentley 的 "Writing Efficient Programs"(遗憾的是已绝版)和 "Programming Pearls"(第 2 版)充满了实用编程的建议。
你必须至少处理每个点一次才能知道它们的距离。除非你想用不同的线多次重复这个过程,否则简单地计算每个点的距离是不可避免的。所以算法必须是 O(n).
既然你不关心实际距离,我们可以对point-distance计算做一些简化。确切距离的计算公式为 (source):
d^2 = |r⨯(p-s)|^2 / |r|^2
其中 ⨯
是叉积,|r|^2
是向量 r
的平方长度。由于 |r|^2
对于所有点都是常数,我们可以在不改变结果的情况下将其从距离计算中省略:
d^2 = |r⨯(p-s)|^2
比较近似平方距离并保持最小值。这个公式的优点是你可以用整数做任何事情,因为你提到所有坐标都是整数。
我有:
- 一组已知大小的点(在我的例子中,只有 6 个点)
- 以 x = s + t * r 为特征的线,其中 x、s 和 r 是 3D 向量
我需要找到最接近给定线的点。实际距离对我来说无所谓。
我看了几个看起来相关的不同问题(包括 this 一个),并且知道如何从我的高中数学中解决这个问题 类。但是我无法在不计算每个距离的情况下找到解决方案,而且我确信必须有一种 better/faster 方式。性能在我的应用程序中绝对至关重要。
还有一件事:所有数字都是整数(点的坐标以及 s 和 r 向量的元素)。同样,出于性能原因,我想将浮点数学运算保持在最低限度。
恐怕你无法计算少于 6 个距离(如果可以,至少会遗漏一个点 -- 包括最近的一个点)。
看看预处理是否有意义:线是固定的,点是变化的吗?考虑旋转坐标使线水平。
由于点数少,怀疑是不是你的瓶颈。 测量 热点所在的位置,重新设计 algorithms/data 表示,加强编译器优化,编译为汇编并将其烧毁。严格按照这个顺序。
Jon Bentley 的 "Writing Efficient Programs"(遗憾的是已绝版)和 "Programming Pearls"(第 2 版)充满了实用编程的建议。
你必须至少处理每个点一次才能知道它们的距离。除非你想用不同的线多次重复这个过程,否则简单地计算每个点的距离是不可避免的。所以算法必须是 O(n).
既然你不关心实际距离,我们可以对point-distance计算做一些简化。确切距离的计算公式为 (source):
d^2 = |r⨯(p-s)|^2 / |r|^2
其中 ⨯
是叉积,|r|^2
是向量 r
的平方长度。由于 |r|^2
对于所有点都是常数,我们可以在不改变结果的情况下将其从距离计算中省略:
d^2 = |r⨯(p-s)|^2
比较近似平方距离并保持最小值。这个公式的优点是你可以用整数做任何事情,因为你提到所有坐标都是整数。