用于检查圆是否完全包含在其他圆的区域中的算法

时间:2016-06-23 16:16:19

标签: geometry computational-geometry geometry-surface

检查下面的蓝色圆圈是否完全包含在其他圆圈(圆圈)中的算法是什么。我希望蓝色圆圈为TRUE,红色圆圈为FALSE

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

enter image description here

3 个答案:

答案 0 :(得分:3)

我认为这不是一个简单的解决方案。

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

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

为了让事情变得更加血腥,多边形可以有洞,你也需要代表它们。

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

我猜所有这些操作都可以从一个基元构建,该基元可以找到磁盘内部的弧形部分(由三个圆圈定义)。

enter image description here

答案 1 :(得分:3)

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

  • 取所有圆圈,找到上或测试圆圈内的所有交点。分割相应的边并构建边图:

enter image description here

对于每个边缘,跟踪创建它的圆圈。

enter image description here

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

    • 如果是,那么C覆盖R.继续进入下一个区域。
    • 如果不是,则R不被C覆盖。环绕其他蓝色边缘R。
    • 如果最后R 未被覆盖,则T未完全覆盖 - 返回 false

eee

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

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

边案例:

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

这个算法高度效率低,而且我不能100%确定是否有更多的退化情况;如果有人有任何建议请告诉我。

答案 2 :(得分:0)

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

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

Determine area of the parts intersecting with our circle

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

enter image description here