Computer vision 如何确定点是否位于仅由水平线和垂直线组成的多边形内?

Computer vision 如何确定点是否位于仅由水平线和垂直线组成的多边形内?,computer-vision,geometry,computational-geometry,Computer Vision,Geometry,Computational Geometry,我想找到一个最好的方法,因为所有坐标都是整数值,多边形只由水平线和垂直线组成。我认为可能有一种简单而快速的方法可以做到这一点。从渐进复杂性的角度来看,直线多边形并不比一般多边形更容易处理:O(N)不进行预处理,O(N logn)经过O(N logn)预处理(但使用复杂的过程) 对于无预处理的情况,该过程很简单:依次考虑每一个垂直侧,并计算从给定点(水平1)向上穿过水平半行的那些(+3向上,向下1)。如果最终计数为非零,则点在内部 轮廓上点的状态取决于应用程序 对于整数坐标不太大的直线多边形,

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

从渐进复杂性的角度来看,直线多边形并不比一般多边形更容易处理:O(N)不进行预处理,O(N logn)经过O(N logn)预处理(但使用复杂的过程)

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

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


对于整数坐标不太大的直线多边形,您可以通过“压缩”它们来做得更好。通过对X和Y进行两次独立排序,可以获得从X(或Y)到[0,N]范围内整数索引的映射。这将得到下面大小为NxN的收缩多边形

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


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

考虑任何多边形,不一定是凸的,仅由水平线和垂直线形成: 取一个点(我画了a,B,C,D),画出穿过该点的水平线和垂直线。 让我们以点A为例。您可以看到穿过它的水平线穿过四个(垂直)线段。请注意,一个线段位于左侧,其他线段位于右侧。
对于点
B
而言,其水平线也穿过四段,但两段在左侧,两段在右侧

点位于多边形内必须满足的条件有:

  • 至少有一段在点的左侧水平交叉
  • 至少有一段在点的右侧水平交叉
  • 左右两侧的交叉数必须为奇数
垂直线的三个条件相同

因此,在伪代码中,它是这样的:

let nL = 0, nR = 0 //left/right counters
let nA = 0, nU = 0 //above/under counters

for each segment s(sx1,sy1, sx2, sy2) in polygon
    if point is on segment
        return true //or false, your choice
    else if segment is vertical and pointY is inside of (sy1,sy2)
        if pointX > min(sx1,sx2)
            nL = nL + 1
        else
            nR = nR + 1
    else if segment is horizontal and pointX is inside of (sx1,sx2)
        if pointY > min(sy1,sy2)
            nU = nU + 1
        else
            nA = nA + 1

//Check conditions
if nL > 0 and nR > 0 and nL is odd and nR is odd
    return true
if nA > 0 and nU > 0 and nA is odd and nU is odd
    return true
return false

指定用法:一个点和一个多边形;多个点与一个多边形;多个多边形对应一个点?