计算每组一组点之间的距离

时间:2012-11-03 17:53:08

标签: geometry distance

所以我正在研究模拟大量的n维粒子,我需要知道每对点之间的距离。允许一些错误,并且如果超过某个阈值,距离根本不相关,是否有任何好的方法来实现这一点?我很确定我是否需要dist(A,C)并且已经知道dist(A,B)dist(B,C)我可以通过[dist(A,B)-dist(B,C) , dist(A,B)+dist(B,C)]绑定它,然后将结果存储在已排序的数组中,但我如果有更好的东西,我想不要重新发明轮子。

我不认为维度的数量应该会对逻辑产生很大的影响,但也许对于某些解决方案而言。提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果问题仅仅是计算所有对之间的距离,那么它将是O(n^2)问题而没有任何更好的解决方案。但是,您说如果距离大于某个阈值D,那么您对它不感兴趣。这为更好的算法打开了机会。

例如,在2D情况下,您可以使用扫描线技术。按字典顺序对点进行排序,首先是y,然后是x。然后使用宽度为D条纹从底部到顶部扫描平面。当条纹在平面上移动时,新点将通过其顶部边缘进入条纹并通过其底部边缘退出。活动点(即当前在条带内的点)应保存在某些可逐步修改的线性数据结构中,并按其x坐标排序。

现在,每当新点进入条纹时,您必须检查左侧和右侧的当前活动点,而不是D(沿x轴测量)。就是这样。

此算法的目的(通常是扫描线方法的情况)是将实际复杂性从O(n^2)推向O(m),其中m是我们实际感兴趣的互动次数。当然,最糟糕的情况是O(n^2)

以上适用于二维情况。对于n维情况,我会说你用不同的技术会更好。某种空间分区在这里应该运行良好,即利用如果已知分区之间的距离大于D这一事实,则没有理由将这些分区中的特定点相互对立。< / p>

答案 1 :(得分:0)

如果超出某个阈值的距离不相关,并且此阈值不是太大,则有一些常用技术可以提高效率:使用空间分区数据结构限制对相邻点的搜索。可能的选择是:

  • 分级。
  • 树木:四叉树(2d),kd-trees。
  • 使用空间哈希进行分箱。

此外,由于从A点到B点的距离与从B点到A点的距离相同,因此该距离应仅计算一次。因此,您应该使用以下循环:

for point i from 0 to n-1:
     for point j from i+1 to n:
        distance(point i, point j)

结合这两种技术对于n体仿真非常常见,例如,如果粒子足够接近,则粒子会相互影响。以下是2d中的一些有趣示例:http://forum.openframeworks.cc/index.php?topic=2860.0

以下是分箱(和散列)的解释:http://www.cs.cornell.edu/~bindel/class/cs5220-f11/notes/spatial.pdf