数据结构和算法检测不规则形状运动物体的碰撞

时间:2011-03-22 08:53:05

标签: algorithm data-structures

我遇到了这个采访问题

  

许多不规则形状的物体在随机方向上移动。提供检测冲突的数据结构和算法。请记住,对象的数量是数百万。

我假设每个对象都有一个x和y坐标。其他假设是最受欢迎的。我想也应该使用某种树,但我对算法一无所知。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

我会看一下Plane Sweep AlgorithmBently-Ottmann Algorithm。它使用平面扫描在O(n log(n))时间(和O(n)空间)确定欧几里得平面上的线的交点。

答案 1 :(得分:2)

您最想要的是将平面细分为空间填充曲线,如z曲线或希尔伯特曲线,从而将2D问题的复杂性降低到1D问题。寻找四叉树。

链接:http://dmytry.com/texts/collision_detection_using_z_order_curve_aka_Morton_order.html

答案 2 :(得分:1)

这个问题有很多解决方案。第一步:使用边界框或圆圈(3D中的球)。如果边界框不相交,则不需要进一步测试。第二:细分你的空间。您不必针对所有其他对象(即O(n ^ 2))测试每个对象。你可以使用四叉树的平均复杂度为O(n)。

答案 3 :(得分:-2)

我想应该有一个循环,它引用1个对象找到坐标,然后检查所有其他对象的其余部分,看是否有任何碰撞。我不确定我的解决方案对于数百万个对象有多好。 伪代码:

For each irregular shaped object1    

int left1, left2;
int right1, right2;
int top1, top2;
int bottom1, bottom2;
bool bRet = 1; // No collision

left1 = object1->x;
right1 = object1->x + object1->width;
top1 = object1->y;
bottom1 = object1->y + object1->height;

For each irregular shaped object2
{
    left2 = object2->x;
    right2 = object2->x + object2->width;
    top2 = object2->y;
    bottom2 = object2->y + object2->height;

    if (bottom1 < top2) bRet =0;
    if (top1 > bottom2) bRet = 0;

    if (right1 < left2) bRet = 0;
    if (left1 > right2) bRet = 0;
}

return  bRet;