多边形算法中的多边形

Polygon in Polygon Algorithm

问题比较简单,判断一个多边形是完全在里面,完全在外面,还是被另一个多边形切割,但是多边形可能共享顶点或部分边。 首先,我想只检查多边形 A 中的每个顶点是否位于多边形 B 的 inside/outside 中,一旦 B 切割 A,这就会失败,请参阅:

左:A 将被归类为 B 之外

右:A会被分类在B的里面

下一个想法是,检查是否有交叉点,如果有交叉点,它被归类为切割,如果有 none,检查 A 的任何点是否在 B 内。然而,这在某些情况下会失败这个检查点落在 B 的边缘上,它可以同时在内部或外部。

因此,只需检查 A 和 B 的所有点,直到找到一个不在 B 的边缘上的点,但是,如果 A 的所有点都在 B 的边缘上,这也可能会失败B、见:

左:A应该属于里面

右:A应该归类为外部

所以问题仍然存在,在这种情况下,如果可以共享边和顶点,您如何毫无疑问地确定多边形 A 位于多边形 B 的内部还是外部。

所以绿色多边形的所有顶点都在黑色多边形的边界上,并且没有“明显”的x形边交点(你应该已经消除了那些;或者你可以在每个交叉点将问题减少到以下情况)。

首先,对于位于另一个多边形边界上的任一多边形的每个顶点,在该点向另一个多边形插入一个人工顶点(如果那里还没有)。您对所有绿色顶点都这样做,也许还有一些黑色顶点。这是必需的,以便所有边缘交叉点都很简单。两条边没有公共点、一个公共点(在它们的公共顶点处)或所有公共点(两个顶点和它们之间的所有东西;这些边是相同的)。

一旦所有路口都很简单,问题就很简单了。

对于绿色边的所有中点,确定所述中点是在黑色多边形的内部还是外部。丢弃那些在边界上的。

如果都在里面,绿色多边形在黑色多边形里面。如果都在外面,那么它就不在里面(可能在外面,或者黑色的可能在绿色的里面;交换角色并再次执行该过程以确定是哪种情况)。如果有的在里面有的在外面,那就是一个有趣的交叉点。

没有不在边界上的中点?这两个多边形是相同的。

如果你想要一个算法,你可以找到两个O(nlog(n))算法in this article(两种用于确定简单多边形之间交点的有效算法)用于两个简单多边形的交集。然后,如果你发现两个简单多边形的交集与其中一个相同(排序顶点并检查它们的相等性),你就会找到解决方案。

此外,您可以在 python shapely package 中找到实现。