我遇到了这个采访问题
许多不规则形状的物体在随机方向上移动。提供检测冲突的数据结构和算法。请记住,对象的数量是数百万。
我假设每个对象都有一个x和y坐标。其他假设是最受欢迎的。我想也应该使用某种树,但我对算法一无所知。
有什么建议吗?
答案 0 :(得分:3)
我会看一下Plane Sweep Algorithm或Bently-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;