【问题标题】:Polygon in Polygon Algorithm多边形算法中的多边形
【发布时间】:2020-07-15 11:49:02
【问题描述】:

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

左:A 将被归类为 B 之外

正确:A 将被归类为 B 内部

下一个想法是,检查是否有交叉点,如果有,则将其归类为切割,如果没有,则检查 A 的任何点,如果它在 B 内。但是,如果这个检查点落在B 的边缘,它可以在里面,也可以在外面。

所以,只需检查 A 和 B 的所有点,直到找到一个不位于 B 边缘的点,但是,如果 A 的所有点都位于 B 的边缘,这也可能失败,见:

Left:A应该归类为inside

右:A应该归类为外

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

【问题讨论】:

  • 你已经尝试了什么?
  • 好吧,所描述的算法不仅仅是想法,我实现了它们,并使用了它们,直到我发现它们在某些情况下失败了。但现在我不知道如何继续改进算法。
  • @OmG 你能解释一下这个链接与这个问题有什么关系吗?据我所见,该线程是关于获取两个多边形的交集,而不是确定多边形 A 是在多边形 B 内部还是外部。

标签: algorithm polygon


【解决方案1】:

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

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

一旦所有的交叉点都简单,问题就简单了。

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

如果它们都在里面,那么绿色多边形就在黑色多边形里面。如果都在外面,那么它不在里面(可能在外面,或者黑色的可能在绿色的里面;颠倒角色并再次执行程序以确定是哪种情况)。如果有的在里面,有的在外面,那就是一个有趣的十字路口。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 2015-03-12
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2012-07-27
      • 2011-09-15
      • 2018-04-10
      相关资源
      最近更新 更多