有没有一种有效的方法来确定距离
Is there an efficient way to determine a distance?
这个问题更多的是关于算法和函数的正确使用,而不是实际的代码。
在我的代码中,我使用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的元对象通常是有用的。如果您可以排除将此元对象作为候选对象考虑,那么您已经排除了将其中的任何对象作为候选对象考虑。
-
如果物体移动缓慢,则下一步最近的邻居通常是当前步骤最近的邻居。从这个开始作为第一个猜测,然后搜索附近的其他物体,然后进一步深入。最终(通常是早晚)你将排除所有剩余的对象。
取决于你的程序在做什么…
但是可以计算出盒子移动时的距离。然后它优化了一些(如果不是所有的)盒子在移动
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 在C++中从距离矩阵创建索引向量的最快方法
- 计算包含高维向量的两个矩阵之间的最小欧氏距离的最快方法
- 使用 DirectXMath 获得 2 点之间距离的最佳方法是什么
- 计算距离:方法"must return a value" ?
- 在OpenCV的距离变换方法上使用CV_DIST_USER时如何设置距离变换公式?
- 最有效的测量点到多边形环的最大/最小距离的方法
- 有没有一种有效的方法来确定距离
- 确定景观中所有点与具有特定属性的点之间距离的最快方法