如何确定一个点是否在多边形内仅由水平线和垂直线组成?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确定一个点是否在多边形内仅由水平线和垂直线组成?相关的知识,希望对你有一定的参考价值。
我想找到一种最好的方法,因为所有坐标都是整数值,而多边形只包含水平和垂直线。我认为可能有一种简单而快速的方法来做到这一点。
从渐近复杂的角度来看,直线多边形的处理并不比一般多边形更简单:没有预处理的O(N),O(N Log N)预处理后的O(Log N)(但是使用复杂的程序) 。
对于没有预处理的情况,程序很简单:依次考虑每个垂直边并计算从给定点穿过水平半线的那些(向上+1,向下-1)。如果最终计数非零,则该点在内部。
轮廓上的点的状态取决于应用程序。
对于没有太大整数坐标的直线poygons,你可以通过“压缩”它们来做得更好一点。通过X和Y上的两个独立排序,您可以获得从X(或Y)到范围[0,N]中的整数索引的映射。这给出了缩小的多边形,大小为NxN。
现在,您可以将多边形嵌入到图像中并进行预处理,以将像素标记为内部/外部(通过种子填充)。在填充两个用于坐标转换的查找表之后,您可以获得恒定时间O(1)中任何点的状态。
这将需要O(N²+ M)预处理时间和存储,其中M是X和Y值的范围。
考虑任何多边形,不是必要的凸起,只用水平和垂直线形成:qazxsw poi
拿一点(我绘制了A,B,C,D)并画出穿过该点的水平和垂直线。
让我们来点。您会看到穿过它的水平线穿过四个(垂直)线段。请注意,一个段位于左侧,其他段位于右侧。
对于点A
,它的水平线也穿过四个段,但左边两个,右边两个。
点必须满足多边形内的条件是:
- 至少一个段在该点的左侧水平交叉。
- 至少一个段在该点的右侧水平交叉。
- 两个交叉数
B
必须是奇数。
垂直线的条件相同。
所以,在伪代码中,它是这样的:
left, right
以上是关于如何确定一个点是否在多边形内仅由水平线和垂直线组成?的主要内容,如果未能解决你的问题,请参考以下文章