C++ 有没有一种有效的方法来确定距离?
这个问题更多的是关于算法和函数的正确使用,而不是实际的代码 在我的代码中,我使用map来模拟长方体。maps元素由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
矢量
作为键和设置
作为值组成
我正在做一个嵌套循环来遍历所有的框:
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对象作为一个候选对象,那么你就排除了作为候选对象内的任何对象。
- 如果对象移动缓慢,则下一步的最近邻居通常是当前步骤的最近邻居。首先以此作为第一个猜测,然后搜索附近的其他物体,然后进一步出国。最终(通常早于晚)您将排除所有剩余对象