Numpy中的点是否在多边形内判断
在本文中,我们将介绍Numpy中如何判断一个点是否在多边形内。对于空间分析、GIS等领域,这是一个常见的需求。
阅读更多:Numpy 教程
什么是多边形
多边形是一个平面图形,由多个线段首尾相连而成。每条线段称为边,两边的交点称为顶点。多边形是由三个或三个以上端点不在一条直线上的线段首尾相连而成的闭合平面图形。
点是否在多边形内的判断方法
判断一个点是否在多边形内有许多方法,这里我们介绍一种基于Numpy的方法。
在介绍具体方法之前,我们需要先介绍两个概念。分别是“射线”和“交点数”。
射线
射线是一条从一个端点出发,终点无限远的直线。我们判断一个点是否在多边形内,就是通过与这个点相交的射线的数量来判断的。
交点数
如果一条射线与多边形的边有交点,就认为这个射线与多边形有交点。如果交点数是奇数,那么这个点就在多边形内部。如果交点数是偶数,那么这个点就在多边形外部。
实现方法
代码实现的思路如下:
1.将多边形的各个顶点以及它们之间的线段转换为向量;
2.对于每个点,画一条射线,判断射线与多边形各边是否相交;
3.统计交点数,判断点是否在多边形内。
实现代码如下:
import numpy as np
def point_in_polygon(pts, p):
"""
判断点是否在多边形内
:param pts: 多边形各个顶点的坐标,顺序任意,数组形状为:(n, 2)
:param p: 待判断点的坐标,数组形状为(2,),其中p[0]为横坐标,p[1]为纵坐标
:return: 布尔值,True表示点在多边形内,False表示点在多边形外
"""
n = len(pts)
# 将多边形的各个顶点以及它们之间的线段转换为向量
edges = np.zeros((n, 2))
edges[:-1] = pts[1:] - pts[:-1]
edges[-1] = pts[0] - pts[-1]
# 对于每个点画一条射线,统计交点数
inter_num = 0
for i in range(n):
x0, y0 = pts[i]
x1, y1 = pts[(i+1)%n]
if (p[1]>=y0 and p[1]<y1) or (p[1]<y0 and p[1]>=y1):
# 求出射线与线段的交点
x_ = x0 + (x1-x0)*(p[1]-y0)/(y1-y0)
if x_ < p[0]:
inter_num += 1
# 统计交点数,如果是奇数,则点在多边形内,否则点在多边形外
if inter_num % 2 == 1:
return True
else:
return False
示例
使用上述实现代码,我们可以方便地判断某个点是否在任意多边形内。例如,下面的代码判断点(2,3)是否在多边形ABCDEF内:
pts = np.array([(1,1),(3,1),(4,3),(3,5),(1,5),(0,3)])
p = np.array([2,3])
print(point_in_polygon(pts,p))
运行结果为:
True
可以看出,点(2,3)在多边形ABCDEF内。
总结
本文中,我们介绍了Numpy中如何判断一个点是否在多边形内的实现方法。这个方法基于射线和交点数的概念,通过对多边形各个线段转换为向量,再对于每条线段画一条射线,统计交点数的方式实现了判断点是否在多边形内的功能。