繁体   English   中英

点是图形内部还是外部(顶点和边缘)?

[英]A point is inside or outside a graph (vertices and edges)?

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

G具有一定的循环,比方说,一个点是在图表上,如果它落入的环路的一个G 循环示例可以是A---B---C---A ,其中ABC是顶点, ---是边。

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

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

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

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

  • 船体内的任何一点都在一个环路内
  • 船体外的任何点都不在任何环路内

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

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

既然我们确信我们有正确的方法来测试我们想要的东西,我们仍然需要一种算法来判断一个点是否在船体内部。 这可以通过光线投射算法的简单扩展来实现

基本上,我们从所有顶点的列表开始,按垂直坐标排序。 然后,对于每对连续的顶点,我们“创建”它们之间的水平线,并检查线相交的第一个和最后一个边 这两条边是船体的一部分。 如果测试点位于这两个边缘中的任何一个之间,则它将位于船体内部。

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

迭代1迭代2迭代3

由于图形是平面的,您可以通过跟踪每个连接的顶点集的轮廓然后测试以查看您的点是否位于这些多边形中的任何一个来完成此操作。

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

在此输入图像描述

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

当且仅当它在一个轮廓内时,你的观点将在一个循环中。

首先,我会在图表中找到设置周期(循环)。 为此,请参阅此SO问题查找无向图中的所有循环

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

一旦有了最大周期,就可以检测多边形内的一个点。 存在各种方法,例如 - 绘制线和边缘交叉的数量 - 从点(0° - >外部,360° - >内部)到多边形顶点的角度之和。

请参阅如何确定2D点是否在多边形内?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM