先上结论,射线法。
简介:
待求点向右延伸,作一条射线
判断该射线和多边形交点的个数n
n==偶数,点在多边形外面
n==奇数,点在多边形内部
示例:
![955fa8d42e5753c91e52f728febe229b.png](https://img-blog.csdnimg.cn/img_convert/955fa8d42e5753c91e52f728febe229b.png)
特例:
d点和g点怎么解决?
这取决于你采用哪种形式判断射线和边是否相交?
本例中采用,判断待求点是否在线段的【ymin,ymax】内,此处,开区间or闭区间都不影响,显然,开区间是0,闭区间是2,都是偶数。
附上代码:
def ispointinPoly(self,point):
N=0
for index0,index1 in self.contourIndex:
start=self.contour[index0]
end=self.contour[index1]
if start[1]==end[1]:
continue
if point[1]<min(start[1],end[1]):
continue
if point[1] >= max(start[1], end[1]):
continue
x = (point[1] - start[1]) * (end[0] - start[0]) / (end[1] - start[1]) +start[0]
if x>point[0]:
N+=1
if N%2==0:
return False
return True