什么是在Python中检查点是否在多边形内的最快方法
什么是在Python中检查点是否在多边形内的最快方法
我找到了两种判断一个点是否在多边形内部的主要方法。一种是使用光线追踪方法,链接在这里[这里],这是最推荐的答案,另一种是使用matplotlib的path.contains_points
方法(对我来说有点晦涩)。我将不断检查很多点。有人知道这两种方法中的哪一种更值得推荐,或者是否有更好的第三种选择吗?
更新:
我检查了这两种方法,matplotlib的速度要快得多。
from time import time import numpy as np import matplotlib.path as mpltPath # 用于测试的正多边形 lenpoly = 100 polygon = [[np.sin(x)+0.5,np.cos(x)+0.5] for x in np.linspace(0,2*np.pi,lenpoly)[:-1]] # 用于测试的随机点集 N = 10000 points = np.random.rand(N,2) # 光线追踪 def ray_tracing_method(x,y,poly): n = len(poly) inside = False p1x,p1y = poly[0] for i in range(n+1): p2x,p2y = poly[i % n] if y > min(p1y,p2y): if y <= max(p1y,p2y): if x <= max(p1x,p2x): if p1y != p2y: xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x if p1x == p2x or x <= xints: inside = not inside p1x,p1y = p2x,p2y return inside start_time = time() inside1 = [ray_tracing_method(point[0], point[1], polygon) for point in points] print("光线追踪耗时: " + str(time()-start_time)) # Matplotlib mplPath start_time = time() path = mpltPath.Path(polygon) inside2 = path.contains_points(points) print("Matplotlib contains_points耗时: " + str(time()-start_time))
得到的结果是,
光线追踪耗时: 0.441395998001 Matplotlib contains_points耗时: 0.00994491577148
当使用三角形而不是100边形时,得到的相对差异相同。我还将检查shapely,因为它看起来是专门处理这类问题的包。