我有一些圈子,我知道他们的X,Y和r。我想检查他们中的任何一个是否与其他任何人一致......检查的方法很简单:
r 1 + r 2 < sqrt((x 1 -x 2 ) 2 +(y 1 -y 2 ) 2 )
但是我必须全部检查所有内容吗?它给了我O(n 2 )的复杂性,我想避免这个:/
答案 0 :(得分:5)
尝试查看KD-tree acc-struct。首先你必须考虑将圆形视为方形而不是计算交集的复杂性,而不是将这些方块放在修改后的KD树中,它需要一些思考,但希望没有太极端......方式kd-tree的工作原理是它取消了根据每个树级别的一些标准,可能匹配的一半。在维基上查找。祝你的问题好运:)
答案 1 :(得分:1)
您可以将空间划分为多个区域,例如:
在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 和半径值,看看它们是否确定 圆的空缺。 但是你应该经常检查是否 圈你看着你,如果它然后跳过那个圈。如果 他们在一个地区,然后计算他们中的任何一个是否 与你发生碰撞(如果在此碰撞,则插入)。
如果只有几个圈子,则跳到右边检查是否有碰撞。
我认为你的后续是检查所有圈子是否在一个范围内,只处理那些圈子。
希望这有帮助。