【问题标题】:A point is inside or outside a graph (vertices and edges)?一个点在图的内部还是外部(顶点和边)?
【发布时间】:2013-10-18 08:47:52
【问题描述】:

我有一个图 G 由边 {E} 和顶点 {V} 组成。 {V} 中的顶点以二维坐标表示。该图是平面的,这意味着没有两条边相交。

图形G 有一些循环,假设一个点位于图形内部,如果它落入G 的循环之一。循环示例可能是A---B---C---A,其中ABC 是顶点,--- 是边。

现在给定一个点(x, y),我如何确定它是在图表内还是在图表外?最好或最简单的方法是什么?

我正在使用 Python,如果有帮助的话。

更新:是的,所有的边都是直线。

【问题讨论】:

  • 循环如何表示?如果它们是圆,你最好问如何检测一个点是否在圆内。
  • @goncalopp 请查看已编辑。
  • @mavErick:所有的边都是直线吗?
  • @HighPerformanceMark 他完美地定义了问题中“内部/外部”图表的含义(假设(v1,v2)是它们之间的直线)
  • 我的意思是 geometric 表示。图是一个数学概念,顶点、边和环也是如此。询问如何检测一个点是否在图形/循环内是没有意义的。如果你想解决一个几何问题,你应该这样描述它。

标签: python algorithm graph-theory


【解决方案1】:

@Peter de Rivaz 提供了一个基本的见解,尽管没有证据:如果它在由图的外部顶点形成的外壳内,则该点在循环内。我们可以通过证明来证明这一点:

  • 船体内部的任何点都在循环内
  • 船体外的任何点都不在任何环内

第一个很容易证明:船体内部的任何一点都在一个循环内,因为船体本身就是一个循环。

第二个可以通过reductio ad absurdum来证明。非常非正式地,对于外壳外部的点要在循环内,外壳外部至少需要一个顶点,并且它与循环内至少有两个其他顶点形成一个循环,使得该点是在同一个循环内。但是,循环之外不能有任何顶点,因为根据定义,所有顶点都在循环内部。因此,根据reductio ad absurdum,在任何循环内都没有船体外部的点。

既然我们确定我们有一个正确的方法来测试我们想要的东西,我们仍然需要一个算法来判断一个点是否在外壳内。这可以通过ray casting algorithm 的简单扩展来实现。

基本上,我们从所有顶点的列表开始,按垂直坐标排序。然后,对于每一对连续的顶点,我们“创建”一条在它们之间的水平线,check what is the first and last edge that the line intersects。这两个边缘是船体的一部分。如果测试点在这两个边缘中的任何一个之间,它将在船体内部。

这是前 3 次迭代的图形表示:

【讨论】:

    【解决方案2】:

    由于图形是平面的,因此您可以通过跟踪每个连接的顶点集的轮廓,然后测试您的点是否在这些多边形中。

    这张图片说明了这个想法:

    红线是代表左侧连接组件轮廓的多边形,而绿线是代表右侧组件轮廓的多边形。

    当且仅当它在其中一个轮廓内时,您的点才会在循环内。

    【讨论】:

      【解决方案3】:

      首先,我会在我的图表中找到设定的循环(循环)。为此,请参阅此 SO 问题Finding all cycles in undirected graphs

      然后计算最大循环集,即那些不包含在另一个循环中的循环(也许您可以同时执行前两个步骤)。

      一旦你有了最大循环,这就是检测多边形内是否有一个点的问题。存在各种方法,例如 - 画一条线和交点的边数 - 从该点到多边形顶点的角度总和(0° -> 外部,360° -> 内部)。

      How can I determine whether a 2D Point is within a Polygon?

      【讨论】:

        猜你喜欢
        • 2017-10-09
        • 2011-02-09
        • 2012-11-26
        • 2018-09-22
        • 2014-03-09
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        相关资源
        最近更新 更多