Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种有效的方法来确定距离?_C++_Algorithm_Scientific Computing - Fatal编程技术网

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

C++ 有没有一种有效的方法来确定距离?,c++,algorithm,scientific-computing,C++,Algorithm,Scientific Computing,这个问题更多的是关于算法和函数的正确使用,而不是实际的代码 在我的代码中,我使用map来模拟长方体。maps元素由矢量作为键和设置作为值组成 我正在做一个嵌套循环来遍历所有的框: mit1 = boxes.begin(); //mit1 is an appropriate iterator int edge = 10;//represnd periodic boundary conditions while (mit1 != boxes.end()){ vector<t> = m

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

在我的代码中,我使用map来模拟长方体。maps元素由
矢量
作为键和
设置
作为值组成

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

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;
  }
}
mit1=box.begin()//mit1是一个合适的迭代器
int-edge=10//重显周期边界条件
while(mit1!=box.end()){
向量=mit1->first;
mit2=mit1++;
while(mit2!=box.end()){
向量u=(mit2++)->第一;
好=真;
对于(int i=0;i<3&&good;i++){
u[i]=(int)fabs(u[i]-t[i]);
好=u[i]==0 | | u[i]==1 | | u[i]==edge;
}
如果(!好)继续;
}
}
我关心的是整个嵌套循环以及
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的元对象通常是有用的。如果你可以排除这个Meta对象作为一个候选对象,那么你就排除了作为候选对象内的任何对象。

  • 如果对象移动缓慢,则下一步的最近邻居通常是当前步骤的最近邻居。首先以此作为第一个猜测,然后搜索附近的其他物体,然后进一步出国。最终(通常早于晚)您将排除所有剩余对象


肯定有更好的方法!!你想计算什么?你确定你没有混淆mit2和u(或者换句话说,你在第二段时间内没有无限循环)?谢谢,我已经改变了循环,现在应该没事了。。。我想消除两个盒子从一个盒子到另一个盒子的情况,这样盒子里的粒子就不可能相互作用了。盒子的大小固定为这样的距离,但是我只剩下盒子距离的计算。你可以展示一些代码,这很好,但是。。。不够。第一件事首先,你应该描述你试图解决的问题,有背景,然后只告诉我们是什么困扰着你。我还在试着理解你是否想要盒子或粒子之间的距离…@Maththieu m:我不显示代码,因为这无关紧要。我在考虑盒子之间的距离,这个距离是由地图中每个成员的第一个元素决定的。我只是对粒子进行了强化(但失败了),使之明白盒子方法实际上是thiton的解决方案。盒子在空间上是固定的,但是它们的大小和数量在变化,而且大多数都是空的。这就是为什么盒子在那里。每个长方体包含粒子,长方体是过滤器。然而,我仍然想找到一种既容易理解又高效的方法…阅读你的编辑。。。这正是我正在做的。唯一的区别是,音量在变化,我不能简单地创建一个表格,在那里我写下所有的对子。此外,大部分卷都是空的,因此无法有效地检查所有的框…a)四元/oct树非常适合此类空卷。b) 与比较所有对象之间的距离相比,检查26个空框非常便宜。c) 同样,随着体积的变化,使用oct树也可以获得相同的效果。