找到重叠的圆圈

时间:2016-04-04 11:37:41

标签: algorithm data-structures computational-geometry

我有一个矩形区域,其中有半径相等的圆圈。我想找到哪些圆圈与其他圆圈重叠(输出是2元素重叠圆圈的列表)。

我知道如何检查两个圆圈是否重叠(它们的中心之间的距离小于直径)。我可以对每对圆圈执行此检查,但我想知道是否有更好的算法(比O(n^2)更快)。

修改

圆圈数通常约为100,重叠不会经常发生。

以下是一些背景信息: 矩形是游戏中的战场。单位的移动是在小台阶上进行的,我试图检测单位之间的碰撞。

3 个答案:

答案 0 :(得分:2)

对于一个简单的解决方案,将中心插入到二维树中,并在每个中心周围执行一个查询半径为2R的圆形范围查询。在良好的条件下,这可以是O(N Log(N))。

或者,只需在X上对中心进行排序并依次尝试所有圆圈:通过二分法搜索,找到横坐标Xc并扫描到Xc-2R和Xc + 2R,然后检查2D距离。

二分法搜索的成本将是O(N Log(N))。如果圆圈均匀地分布在边S的正方形中,则宽度为4R的条带包含4RN / S个圆,因此总比较成本为4RN 2 / S.如果S很大,这是一个很好的表现(认为对于方形中的N个紧密圆圈,S~2R√N,因此2N√N比较)。

答案 1 :(得分:2)

直接回答:一般来说,你不能比O(n ^ 2)好,因为圈子可能全部重叠,所以你必须生成n ^ 2个答案。

如果你更具体,你可能会得到更好的答案。例如,如果您真正想要做的是在2D模拟中找到边界球体,您可以从实体仅在帧之间移动这一事实中获益,如果圆形稀疏则它们与它们何时不同紧紧包装等等。让我们更多地了解它的全部内容。

编辑:你编辑了你的问题 - 你确实在2D模拟中寻找碰撞检测。如果您查看https://en.wikipedia.org/wiki/Collision_detection,他们会针对您的情况指出几种算法。

我喜欢该页面上的详细权利,您可以在其中保留每个轴的一个边界间隔列表(2" 2D")并且只需要"努力工作"当那些边界间隔(根据定义它们本身是一维的)改变时(即,#34;重叠状态")。对于行为良好的案例,这将删除O(n²)。他们没有对其复杂性做出估计,但由于它基本上归结为排序,因此对我来说它看起来或多或少O(n logn),而当帧之间的变化很小时则更少。

答案 2 :(得分:2)

鉴于对问题陈述的新解释,我建议采用不同的方法。

在战场上叠加方格,网格步长等于一个圆直径。每个圆圈最多可以重叠四个单元格。在每个单元格中,保留重叠圆圈的列表(并在每次移动时更新它)。

检测潜在碰撞现在每个圆圈将进行大约四次细胞/圆形测试,即接近线性时间。