【问题标题】:Algorithm to check if a Circle is totally contained in the area of other circles检查一个圆是否完全包含在其他圆的区域中的算法
【发布时间】:2016-06-23 16:16:18
【问题描述】:

检查一个像下面蓝色的圆圈是否完全包含在其他圆圈(while 圆圈)的区域中的算法是什么。我想要蓝色圆圈为 TRUE,红色圆圈为 FALSE

所有圆的输入是它们的坐标和半径。

【问题讨论】:

    标签: geometry computational-geometry geometry-surface


    【解决方案1】:

    这是一个粗略的解决方案:

    • 取出所有圆并找到 所有个交点,这些交点在 在测试圆 T 上或内部。分割相应的边并构建边图:

    为每条边跟踪创建它的圆。

    • 对于你找到的每个区域 R 的每个边界 E,取 E 所属的圆 C。如果 C 是 not T(红色) - 即 E 是蓝色,请检查 R 其他边缘上的点是否在 C 内:

      • 如果是,则 C 覆盖 R。继续下一个区域。
      • 如果不是,则 R 未被 C 覆盖。循环覆盖 R 的其他蓝色边缘。
      • 如果最后 R 仍然未被覆盖,则 T 未被完全覆盖 - 返回 false

    上图中,C包含B,所以R被覆盖;但是C不包含A,所以不覆盖S

    • 如果您在此阶段尚未返回,则返回 true

    副案:

    • 如果某个圆圈包含 T,则忽略它。
    • 如果 T 包含 it,则 延迟 将交集测试存储在列表中。最后重做测试并分割它的边缘。

    这个算法非常效率低下,我不能 100% 确定是否还有退化的情况;如果有人有任何建议,请告诉我。

    【讨论】:

      【解决方案2】:

      我认为没有简单的解决方案。

      我会通过依次取每个圆圈,并对所有其他圆圈执行布尔减法来解决这个问题。 (足够远的圆圈 - R0 + R1

      吃完碎片后,圆变成由圆弧或一组这样的多边形组成的曲线多边形,因为连接可能会被破坏。多边形可以由为其轮廓提供圆弧的圆列表表示,圆弧端点由两个连续邻居或目标圆和邻居的公共交点定义。请注意,同一个邻居可能会出现多次。

      为了让事情更血腥一点,多边形可以有洞,你也需要表现出来。

      然后一个关键的操作是从一个曲线多边形中减去一个圆。您需要检测完全在新​​圆圈内的弧线以及穿过它的弧线。获得弧的剩余部分后,您需要重新排列剩余的弧和新的弧。

      我想所有这些操作都可以从一个单一的原语构建,该原语找到圆盘内的弧(由三个圆圈定义)部分。

      【讨论】:

        【解决方案3】:

        这看起来很简单(编辑:但不是):如果给定圆的每条弧的每个点都包含在至少一个其他圆中,则包含整个圆。然后,您必须找到所有交点 (algorithm to detect if a Circles intersect with any other circle in the same plane),并检查这些交点指定的所有弧。如果给定与圆 B 的两个交点的圆 A 的圆弧 A1-A2 的任何“内部”点(圆弧 B1-B2,其中点 A1=B1 和 A2=B2)包含在圆 B 中,则整个圆弧为包含在 B 圈中,反之亦然。如果我错了,请纠正我。

        编辑:好的,我已经知道,我错了,正如 maxim1000 所示。这比我想象的要复杂。我想在我的答案中添加一些东西,但我不确定这是否是一个解决方案。不过,我希望它有所帮助。即:我想确定我们心目中的圈子与所有其他圈子之间的交集总面积。我们在我们的圆内找到所有分离的交点——所有包含相同点的部分,被所有相交的弧分开——并找到它们的区域。吴总结。如果它等于我们圆的面积,那么我们的圆包含在其他圆中。确定这个区域本身可能是一个问题,但正如我所说,它可能会导致正确的方向。让我也想想..

        编辑:经过一段时间的思考。确定(多个)相交圆中的所有区域只是添加或减去三角形或......嗯......如何调用它们? ...图像上的黄色部分:)

        【讨论】:

        • 考虑一个大圆圈,它的边界完全被小圆圈覆盖。大圆圈的中心肯定不会被小圆圈覆盖。如果我正确理解这个问题,那就是关于内部的圆圈。
        • 没错。白色圆圈符合一个区域,其他圆圈可能与该区域或其一部分重叠。这是我需要检查的。
        • 我试图在我的回答中提出一些有用的建议。请稍后检查编辑。
        • 它们是次要部分
        • 感谢小片段:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        相关资源
        最近更新 更多