什么是在Python中检查点是否在多边形内的最快方法

9 浏览
0 Comments

什么是在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,因为它看起来是专门处理这类问题的包。

0