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

问题描述 投票:-1回答:2

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

computer-vision geometry computational-geometry
2个回答
0
投票

从渐近复杂的角度来看,直线多边形的处理并不比一般多边形更简单:没有预处理的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值的范围。


-1
投票

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

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

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

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

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

垂直线的条件相同。

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

left, right
© www.soinside.com 2019 - 2024. All rights reserved.