我有一个图G
由边{E}
和顶点{V}
组成。 {V}
中的顶点以二维坐标表示。图形是平面的,这意味着没有两条边相交。
图G
有一些循环,如果它位于G
的一个循环中,则说明一个点在图中。循环示例可以是A---B---C---A
,其中A
,B
和C
是顶点,---
是边缘。
现在给出一个点(x, y)
,如何确定它是在图表内还是在之外?什么是最好的方式或最简单的方法?
我正在使用Python,如果有帮助的话。
更新:是的,所有边都是直线。
答案 0 :(得分:2)
第一个很容易证明:船体内的任何一点都在一个环路内,因为船体本身就是一个环。
第二个可以通过 reductio ad absurdum 来证明。非常非正式地,对于船体外部的一个点在一个环内,需要在船体外面至少有一个顶点,并且它要在环内形成一个至少有两个其他顶点的环,这样点就是在同一个循环里面。但是,循环外不能有任何顶点,因为根据定义,所有顶点都在其中。因此,通过 reductio ad absurdum ,船体外部没有任何环路内的点。
既然我们确信我们有正确的方法来测试我们想要的东西,我们仍然需要一种算法来判断一个点是否在船体内部。这可以通过ray casting algorithm的简单扩展来实现。
基本上,我们从所有顶点的列表开始,按垂直坐标排序。然后,对于每对连续的顶点,我们“创建”它们之间的水平线和check what is the first and last edge that the line intersects。这两条边是船体的一部分。如果测试点位于这两个边缘中的任何一个之间,则它将位于船体内部。
这是前3次迭代的图形表示:
答案 1 :(得分:1)
由于图形是平面的,您可以通过跟踪每个连接的顶点集的轮廓然后测试以查看您的点是否位于这些多边形中的任何一个来完成此操作。
这张照片说明了这个想法:
红线是表示左手连接组件轮廓的多边形,而绿线是表示右手组件轮廓的多边形。
当且仅当它在一个轮廓内时,你的观点将在一个循环中。
答案 2 :(得分:0)
首先,我将在图形中找到设置的周期(循环)。为此,请参见此问题Finding all cycles in undirected graphs
然后计算最大周期集,即另一个周期中不包含的最大周期(也许您可以同时执行前两个步骤)。
一旦您拥有最大的循环数,就可以检测出多边形内的某个点。存在各种方法,例如。 -画一条线和边的交点数 -从点(0°->外部,360°->内部)到多边形顶点的角度之和。
请参见How can I determine whether a 2D Point is within a Polygon?