检查是否有碰撞的圆圈

时间:2012-03-03 11:10:57

标签: algorithm collision-detection intersection geometry

我有一些圈子,我知道他们的X,Y和r。我想检查他们中的任何一个是否与其他任何人一致......检查的方法很简单:

  

r 1 + r 2 < sqrt((x 1 -x 2 2 +(y 1 -y 2 2

但是我必须全部检查所有内容吗?它给了我O(n 2 )的复杂性,我想避免这个:/

4 个答案:

答案 0 :(得分:5)

尝试查看KD-tree acc-struct。首先你必须考虑将圆形视为方形而不是计算交集的复杂性,而不是将这些方块放在修改后的KD树中,它需要一些思考,但希望没有太极端......方式kd-tree的工作原理是它取消了根据每个树级别的一些标准,可能匹配的一半。在维基上查找。祝你的问题好运:)

答案 1 :(得分:1)

您可以将空间划分为多个区域,例如:

  1. 为所有圆计算2D AABB - 轴对齐边界框
  2. 将其分为四个子框
  3. 对每个子框分配圆圈,如果圆圈甚至略微穿过这样的方框,则必须将其放入此类框中。这意味着可以将圆圈分配给多个框。
  4. 迭代每个圆圈,然后检查分配到哪个方框,并仅使用该方框中的圆圈计算碰撞。
  5. 在2.您可以根据空间大小进行多次细分,如果将​​多个圆分配给一个框,则进一步细分。

答案 2 :(得分:1)

使用方形边框作为简单的初始测试。然后才转到圈子。

另外

r1+r2 < sqrt((x1-x2)² + (y1-y2)²)

可以重写为:

(r1+r2)² < (x1-x2)² + (y1-y2)²

删除那个令人讨厌的sqrt()

答案 3 :(得分:0)

有很多圈子吗? 在我看来,最好的事情就是在数组中设置你的圈子。 因此,您将拥有一系列圆圈,这不仅使他们更容易初始化,而且都在一个地方。

接下来的部分是取圆圈并给它一个测试碰撞的功能。 e.g。

void isCol(Array [circles],此圆圈所在的当前矢量等。)

如果有很多圈子

制作一个for循环,通过数组检查每个X,Y   和半径值,看看它们是否确定    圆的空缺。 但是你应该经常检查是否    圈你看着你,如果它然后跳过那个圈。如果    他们在一个地区,然后计算他们中的任何一个是否    与你发生碰撞(如果在此碰撞,则插入)。

如果只有几个圈子,则跳到右边检查是否有碰撞。

我认为你的后续是检查所有圈子是否在一个范围内,只处理那些圈子。

希望这有帮助。