我有一些圆,知道它们的 X、Y 和 r 值,想要检查它们中的任何两个是否相交... 检查的方式很简单:
r1+r2 < sqrt((x1-x2) 2 +(y1-y2)2)
但是我必须逐个检查吗?这会给我带来 O(n2) 的复杂度,而我想避免这种情况 :/
r1+r2 < sqrt((x1-x2) 2 +(y1-y2)2)
但是我必须逐个检查吗?这会给我带来 O(n2) 的复杂度,而我想避免这种情况 :/
尝试查看KD树数据结构。首先,您必须将圆形视为正方形,计算交集的复杂度要小得多,然后将这些正方形放入修改后的KD树中,这需要一些思考,但希望不会太极端... KD树的工作方式是基于每个树级别的某些标准取消可能匹配的一半。在维基百科上查找它。祝你好运 :)
在编程中,使用正方形边界框作为简单的初始测试。然后才能使用圆形。
另外
r1+r2 < sqrt((x1-x2)² + (y1-y2)²)
可以被重写为:
(r1+r2)² < (x1-x2)² + (y1-y2)²
这将消除那个讨厌的sqrt()
您可以将空间划分为区域,例如:
在第2步中,您可以进行许多细分,具体取决于您的空间大小,如果有太多圆分配给一个框,则进一步细分。
有很多圆吗? 我认为最好的方法是将您的圆设置为数组。 因此,您将拥有一个圆的数组,不仅使它们更容易初始化,而且都在同一个地方。
下一步是将圆形赋予一个测试碰撞的函数。 例如:
void isCol(Array [circles],当前向量所在的圆等);
如果有很多圆
制作一个for循环,遍历数组,检查每个圆的X、Y和半径值,看它们是否在某个圆周附近。 但是,您应该始终检查您正在查看的圆是否是您自己,如果是,则跳过该圆。如果它们在区域内,则计算它们是否与您发生碰撞,并进行(插入碰撞后果)。
如果只有几个圆,则直接跳到检查碰撞。
我认为您想要的是检查所有圆是否在范围内,并仅处理那些在范围内的圆。
希望这可以帮助您。