【问题标题】:common overlap of N circlesN个圆的共同重叠
【发布时间】:2014-09-22 14:56:54
【问题描述】:

有 N 个圆由它们的半径和中心坐标表示,我想知道是否存在一种算法来确定点 P 是否存在,使得 P 在所有圆内。

【问题讨论】:

标签: algorithm math geometry computer-science computational-geometry


【解决方案1】:

一种简单的 O(n^3) 方法是简单地计算每对圆的交点,然后对每个交点进行测试以查看它是否在所有圆中。

会有O(n^2)个交叉点,测试每个需要O(n),所以总体来说是O(n^3)。

我认为唯一的方法是所有圆内都有点而不是交点,如果最里面的圆完全在其他圆内,那么你还应该测试每个圆的中心。

【讨论】:

  • 谢谢。我不同意最后一部分。
  • 检测一个圆是否在所有其他圆内可以在交点计算中完成。
  • 一个加速:如果所有圆都没有共同点,很可能有一些圆不相交。所以对于很多“否”的例子,你可以在 O(n^2) 的时间内得到一个正确的“否”答案,并且 2 圈相交测试非常快:is (r1+r2)^2 all “No”-instances:例如,可以安排 3 个圆圈,使它们中的任何一对都有一些轻微的重叠,但没有一点在所有 3 个的共同交点. 因此,在最坏的情况下仍然需要完整的 O(n^3)。)
  • 是的,实际上我做了同样的事情。
  • 我认为这不起作用(或需要另一个步骤)。考虑两个相交的圆和完全包含前两个的第三个圆(没有相交)。大圆中心不必位于前两个的交叉区域,该区域也可以是所有三个区域的共同点。
【解决方案2】:

如果你可以按顺序计算交点,那么你可以得到O(N^2)算法。

每个圆的交点都是一个类似于多边形的凸图形,但有弧边。与n 第一个圆圈相交后,您将获得不超过O(n) 边的相交区域。因此,为了计算它与下一个 (n+1-th) 圆的交点,您需要 O(n) 工作。遍历所有N 圈子,您将需要O(N^2) 工作总数。

此算法的优点还在于它更早地以答案 no 终止 - 如果您在步骤 n 上得到一个空交集,则在后续步骤中它不会变为非空。

一个缺点 - 必须处理“弧形”多边形。

【讨论】:

  • 这是一个不错的方法。谢谢。
  • 确保对每个交叉点进行检查以考虑添加的圆完全在弧边多边形内或完全外的情况。
  • 这可能仍然是一个好方法,特别是如果你很好地订购了圆圈,但是你声称与任何 n 个圆圈相交会产生一个最多有 n 个“弧边”的图形是错误的。假设你有两个只相交一点的大圆,产生一个又高又窄的“透镜状”相交。现在,以镜头中心为中心的第三个较小的圆圈,其直径略大于镜头最宽处的宽度,将夹住镜头的顶部和底部,引入​​ two 新“弧边”。一般来说,我认为再增加 1 个圆圈可以创建 n 个新边。
  • @j_random_hacker - 我同意,我的主张在没有证据的情况下看起来很弱。我会努力找到的
  • @j_random_hacker - 请看我的回答,有O(n)
【解决方案3】:

让我们看看O(N)算法是否可行:

1) 找出半径最小的圆。将其表示为 Cs。
2) 检查 Cs 是否被所有其他圆圈完全包围。如果是,则 Cs 中的任何点都是解决方案。如果不是,忽略那些完全包围 Cs 的圆圈。这会将圆的数量减少到 M,其中 M 3) 检查是否有任何圆与 Cs 相交。如果没有圆与 Cs 相交,则没有解。如果是,则查找是否有任何交点在所有其余 (M-1) 个圆内。如果是,则交点是解决方案。如果再不行,那就没有办法了。

以上所有步骤的计算都是O(N),所以整体计算也应该是O(N)。

【讨论】:

  • +1 表示首先丢弃完全包含最小圆圈的所有内容。我认为这可以解决我在@PeterdeRivaz 回答中提到的问题。但是在最坏的情况下,您可能仍需要检查所有 O(N^2) 圆与圆的交点。考虑在 ({1,0},{0,0},{-1,0}} 处的三个半径为 2 的圆,看看为什么会这样。(如果你愿意,可以将中心稍微小一点)
  • @george:你是对的。在步骤(3)中,我们应该找到 Cs 和其他圆之间的所有交点。这应该处理您的“三个重叠的圆圈”示例,并保持算法 O(N)。
  • 转念一想,即使计算所有的交点也无济于事。猜猜我们毕竟不得不求助于 O(N^2) 算法。
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多