Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 找到重叠的圆_Algorithm_Data Structures_Computational Geometry - Fatal编程技术网

Algorithm 找到重叠的圆

Algorithm 找到重叠的圆,algorithm,data-structures,computational-geometry,Algorithm,Data Structures,Computational Geometry,我有一个矩形区域,其中有半径相等的圆。我想找出哪些圆与其他圆重叠(输出是重叠圆的两个元素集的列表) 我知道如何检查两个圆是否重叠(它们中心之间的距离小于直径)。我可以对每对圆执行此检查,但我想知道是否有更好的算法(比O(n^2)更快) 编辑 圆圈的数量通常在100左右,重叠不会经常发生 以下是一些背景: 长方形是游戏中的战场。单元的移动是以小步进行的,我正在尝试检测单元之间的碰撞。对于一个简单的解决方案,在2d树中插入中心,并使用查询半径2R围绕每个中心执行循环范围查询。在良好的条件下,这可以是

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

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

编辑

圆圈的数量通常在100左右,重叠不会经常发生

以下是一些背景:
长方形是游戏中的战场。单元的移动是以小步进行的,我正在尝试检测单元之间的碰撞。

对于一个简单的解决方案,在2d树中插入中心,并使用查询半径2R围绕每个中心执行循环范围查询。在良好的条件下,这可以是O(N Log(N))


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


二分法搜索的成本为O(N Log(N))。如果圆均匀地分布在S边的正方形中,则宽度为4R的条纹包含4RN/S圆,因此总比较成本为4RN²/S。如果S较大,则这是一个良好的性能(假设正方形中N个紧密排列的圆,S~2R)√N、 因此2N√N个比较)。

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

如果你说得更具体,你可能会得到更好的答案。例如,如果您真正想做的是在2D模拟中找到边界球体,那么您可以从以下事实中获益:实体仅在帧之间移动如此之远,如果圆是稀疏的,则与它们紧密排列时不同,等等。因此,让我们更多地了解这一切

编辑:您编辑了您的问题-您确实在二维模拟中寻找碰撞检测。如果你检查出来,他们指出了几个算法正是你的情况


我喜欢该页右侧的一个详细列表,其中每个轴都有一个边界间隔列表(2个在“2D”中),当这些边界间隔(定义为一维)发生变化(即存在“重叠状态”)时,只需“努力工作”。这将删除行为良好案例的
O(n²)
。他们没有对其复杂性进行估计,但由于它基本上归结为排序,在我看来,它或多或少是
O(n logn)
,而在帧之间只有最小的变化时,它就更少了。

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

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


检测潜在碰撞现在每个圆大约需要四个单元/圆测试,即接近线性时间。

好问题。:)在我看来你可以做一些扫描线算法。所有圆都可以与所有其他圆重叠。对我来说,这意味着在最坏的情况下,你不可能比O(n^2)做得更好——尽管可能会有一些启发式算法来优化它。@GordonLinoff我认为应该有一个输出敏感的算法——一个在时间上与重叠数(和圈数)成比例运行的算法;有些相关的线段相交问题就是这样。你的问题不够精确。预期产量是多少
n
圆可以形成一条链,其中任何一个圆都可以与另外两个圆重叠。在这种情况下,输出是什么?n有多大?鉴于n的值很低,不确定这是否能击败穷举搜索:(O(n²)是的,指出这一点是我的本意——如果OP向我们提供更具体的信息,我们可以考虑其他解决方案。他确实这样做了,事实上,我将编辑答案。)