Tôi đã tìm thấy hai phương pháp chính để xem một điểm có nằm trong một đa giác hay không. Một là sử dụng phương pháp dò tia được sử dụng ở đây , đây là câu trả lời được đề xuất nhiều nhất, phương pháp còn lại là sử dụng matplotlib path.contains_points
(có vẻ hơi tối nghĩa với tôi). Tôi sẽ phải kiểm tra rất nhiều điểm liên tục. Có ai biết nếu bất kỳ cái nào trong hai cái này được giới thiệu nhiều hơn cái kia hoặc nếu có lựa chọn thứ ba thậm chí tốt hơn?
CẬP NHẬT:
Tôi đã kiểm tra hai phương pháp và matplotlib trông nhanh hơn nhiều.
from time import time
import numpy as np
import matplotlib.path as mpltPath
# regular polygon for testing
lenpoly = 100
polygon = [[np.sin(x)+0.5,np.cos(x)+0.5] for x in np.linspace(0,2*np.pi,lenpoly)[:-1]]
# random points set of points to test
N = 10000
points = zip(np.random.random(N),np.random.random(N))
# Ray tracing
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 "Ray Tracing Elapsed time: " + str(time()-start_time)
# Matplotlib mplPath
start_time = time()
path = mpltPath.Path(polygon)
inside2 = path.contains_points(points)
print "Matplotlib contains_points Elapsed time: " + str(time()-start_time)
mang lại,
Ray Tracing Elapsed time: 0.441395998001
Matplotlib contains_points Elapsed time: 0.00994491577148
Sự khác biệt tương đối tương tự thu được khi sử dụng một tam giác thay vì đa giác 100 cạnh. Tôi cũng sẽ kiểm tra một cách khéo léo vì nó có vẻ là một gói chỉ dành cho những loại vấn đề này