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