有没有一种有效的方法来确定距离

Is there an efficient way to determine a distance?

本文关键字:方法 距离 有效 一种 有没有      更新时间:2023-10-16

这个问题更多的是关于算法和函数的正确使用,而不是实际的代码。

在我的代码中,我使用map来模拟盒子。映射元素由vector<int>作为键和set<shared_ptr<foo> >作为值组成。

我正在做一个嵌套循环来遍历所有的盒子:

mit1 = boxes.begin(); //mit1 is an appropriate iterator
int edge = 10;//represnd periodic boundary conditions
while (mit1 != boxes.end()){
  vector<t> = mit1->first;
  mit2 = mit1++;
  while (mit2 != boxes.end()){
    vector<int> u = (mit2++)->first;
    bool good = true;
    for (int i = 0; i < 3 && good; i++){
      u[i] = (int)fabs(u[i] - t[i]);
      good = u[i] == 0 || u[i] == 1 || u[i] == edge;
    }
    if (!good) continue;
  }
}

我关心的是整个嵌套循环以及for循环。你认为用一个函数来计算所有相邻的盒子会更有效率吗?你知道更好的for循环测试方法吗?

与每次碰撞检测相同的建议:使用一些算法或数据结构,允许您根据空间距离预过滤循环的候选对象,并允许在O(n)内完成此预过滤。你会想到四叉树,或者粗粒度的空间图。

编辑:为了让整个想法更清晰一点,考虑以下算法:你在3D空间中有N个粒子,想要找出哪些粒子彼此之间的距离小于D。你创建一个3D数组,每个箱子代表目标空间的一个立方体积,每个体积必须至少是D大小。要找到所有可能比D更接近给定粒子X的粒子,你需要确定X当前所在的数组单元Ax,并从Ax和周围的所有单元中选择所有粒子。您只需要检查这个小子集的碰撞。

当使用M数组单元格时,整个距离检查的平均计算复杂度现在是O(N*N/M)而不是O(N^2),但是代价是O(M^2)空间。

如果您的目标空间是无界的,则使用四叉树(2D)或oct树(3D)。

这是一般碰撞/思想问题的简化版本。当你有一堆物体时,这些问题变得特别棘手,每个物体都由许多多边形面描述。对于这些问题,没有一刀切的解决方案。有很多启发式方法可以帮助解决这个问题。其中几个:

  • 使用边界球体和边界框。一对球体之间的距离比一对盒子之间的距离容易计算得多,并且一对边界球体之间的距离永远不会超过一对边界盒子之间的距离。

  • 使用对象层次结构。如果对象A, B, C和D总是彼此非常接近,那么创建包含A, B, C和D的元对象通常是有用的。如果您可以排除将此元对象作为候选对象考虑,那么您已经排除了将其中的任何对象作为候选对象考虑。

  • 如果物体移动缓慢,则下一步最近的邻居通常是当前步骤最近的邻居。从这个开始作为第一个猜测,然后搜索附近的其他物体,然后进一步深入。最终(通常是早晚)你将排除所有剩余的对象。

取决于你的程序在做什么…

但是可以计算出盒子移动时的距离。然后它优化了一些(如果不是所有的)盒子在移动