如何确定一个点是否在多边形内仅由水平线和垂直线组成?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确定一个点是否在多边形内仅由水平线和垂直线组成?相关的知识,希望对你有一定的参考价值。

我想找到一种最好的方法,因为所有坐标都是整数值,而多边形只包含水平和垂直线。我认为可能有一种简单而快速的方法来做到这一点。

答案

从渐近复杂的角度来看,直线多边形的处理并不比一般多边形更简单:没有预处理的O(N),O(N Log N)预处理后的O(Log N)(但是使用复杂的程序) 。

对于没有预处理的情况,程序很简单:依次考虑每个垂直边并计算从给定点穿过水平半线的那些(向上+1,向下-1)。如果最终计数非零,则该点在内部。

enter image description here

轮廓上的点的状态取决于应用程序。


对于没有太大整数坐标的直线poygons,你可以通过“压缩”它们来做得更好一点。通过X和Y上的两个独立排序,您可以获得从X(或Y)到范围[0,N]中的整数索引的映射。这给出了缩小的多边形,大小为NxN。

enter image description here

现在,您可以将多边形嵌入到图像中并进行预处理,以将像素标记为内部/外部(通过种子填充)。在填充两个用于坐标转换的查找表之后,您可以获得恒定时间O(1)中任何点的状态。

这将需要O(N²+ M)预处理时间和存储,其中M是X和Y值的范围。

另一答案

考虑任何多边形,不是必要的凸起,只用水平和垂直线形成:qazxsw poi

拿一点(我绘制了A,B,C,D)并画出穿过该点的水平和垂直线。

让我们来点enter image description here。您会看到穿过它的水平线穿过四个(垂直)线段。请注意,一个段位于左侧,其他段位于右侧。 对于点A,它的水平线也穿过四个段,但左边两个,右边两个。

点必须满足多边形内的条件是:

  • 至少一个段在该点的左侧水平交叉。
  • 至少一个段在该点的右侧水平交叉。
  • 两个交叉数B必须是奇数。

垂直线的条件相同。

所以,在伪代码中,它是这样的:

left, right

以上是关于如何确定一个点是否在多边形内仅由水平线和垂直线组成?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个指定的经纬度点是不是落在一个多边形区域内

判断点是不是在多边形内部的方法

unity 如何知道物体是否在椭圆范围内?

如何使用Python镜像多边形?

iOS - 检查[CGPoint]直线

Qt 学习之路 2(26):反走样