python射线法判断点与多边形的位置关系
博客为本人的学习笔记,多多学习,一起交流。
常见的判断点与多边形的位置关系有面积法,角度法以及射线法
射线法的思想为:以目标点为端点引一条射线,统计射线和多边各边的交点数目。如果交点个数为奇数,则点在多边形的内部,反之则在多边形外部。
以射线法的实现为例,代码如下:
#write by heheyang
def in_or_out(point,rangelist): #point为点,rangelist为多边形的定点
#排除不在范围内的点
rlon=[]
rlat=[]
for p in rangelist:
rlon.append(p[0])
rlat.append(p[1])
maxlon=max(rlon)
maxlat=max(rlat)
minlon=min(rlon)
minlat=min(rlat)
if (point[0] > maxlon or point[0] < minlon or point[1] > maxlat or point[1] < minlat):
return False
#构建各边
s_list=[]
for i in range(0,len(rangelist)):
s_list_x = []
if i!=len(rangelist)-1:
s_list_x.append(rangelist[i])
s_list_x.append(rangelist[i+1])
s_list.append(s_list_x)
else:
s_list_x.append(rangelist[i])
s_list_x.append(rangelist[0])
s_list.append(s_list_x)
#判断射线与各边的交点个数以及交点是否在边
common=0
for i in range(0,len(s_list)):
if s_list[i][1][0]-s_list[i][0][0]==0:
if point[0]==s_list[i][0][0]:
common+=1
else:
y=((s_list[i][1][1]-s_list[i][0][1])/(s_list[i][1][0]-s_list[i][0][0]))*(point[0]-s_list[i][0][0])+s_list[i][0][1]
if y==point[1]:#考虑交点在边的情况
p=True
elif y>point[1] and y<=max(s_list[i][0][1],s_list[i][1][1]):
common+=1
#判断in or out
if common%2!=0 or p:
return True
else:
return False
程序是射线法的简单实现,判断点的多边形的内部或者外部(内部包括:多边形的边及定点),如果在多边形的内部函数返回True,反之False。
举例:
point_list=[[0,0],[4,5],[2,3],[3,6]]
rangelist=[[0,0],[0,5],[5,5],[5,0]]
for point in point_list:
print(in_or_out(point,rangelist))
运行结果如图:
在简单的多边形基础上,能够满足一定需求,但是在一些复杂的多边形情况,可能会出现结果不正确的情况,还需要做相关的测试改进。
数据小白欢迎大家一起交流学习,一起进步