我正在尝试编写一个处理各种对象检测的程序。物体具有原点,宽度,高度和速度。有没有办法设置数据结构/算法,以便每个对象不检查每个其他对象?
我试图避免的问题的一些示例代码:
for (int i = 0; i < ballCount; i++)
{
for (int j = i + 1; j < ballCount; j++)
{
if (balls[i].colliding(balls[j]))
{
balls[i].resolveCollision(balls[j]);
}
}
}
答案 0 :(得分:2)
您可以使用quadtree快速查找与另一个矩形相交的所有矩形。如果需要处理非矩形形状,可以先找到bounding boxes相交的对象。
四叉树的一些常见用途
- ...
- 二维高效碰撞检测
- ...
答案 1 :(得分:1)
正如其他答案中所提到的,您可以使用四叉树结构来加快碰撞检测。
我会推荐GEOS开源C ++库,它具有良好的四叉树实现。 Here are the docs for their quadtree class
所以你的伪代码看起来像这样:
Quadtree quadtree;
// Create and populate the quadtree.
// Change it whenever the balls move.
// Here's the intersection loop:
for (int i=0; i<ballCount; ++i) {
Envelope envelope = ...; // Get the bounds (envelope) of ball i
std::vector<void*> possiblyIntersectingBalls;
quadtree.query(envelope, possiblyIntersectingBalls);
// Now loop over the members of possiblyIntersectingBalls to check
// if they really intersect, since quadtree only checks bounding
// box intersection.
}