碰撞检测和时间复杂度:如何更容易地检查碰撞?

时间:2012-07-06 21:55:14

标签: c++ c collision-detection

我正在尝试编写一个处理各种对象检测的程序。物体具有原点,宽度,高度和速度。有没有办法设置数据结构/算法,以便每个对象不检查每个其他对象?

我试图避免的问题的一些示例代码:

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]);
       }
    }
}

2 个答案:

答案 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.
}