python射线法判断点与多边形的位置关系

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))

运行结果如图:
在这里插入图片描述
在简单的多边形基础上,能够满足一定需求,但是在一些复杂的多边形情况,可能会出现结果不正确的情况,还需要做相关的测试改进。
数据小白欢迎大家一起交流学习,一起进步

猜你喜欢

转载自blog.csdn.net/heheyangxyy/article/details/106193299