Ich habe zwei Hauptmethoden gefunden, um zu prüfen, ob ein Punkt in ein Polygon gehört. Der eine verwendet die hier verwendete Raytracing-Methode , die die am meisten empfohlene Antwort ist, der andere verwendet Matplotlib path.contains_points
(was mir etwas dunkel erscheint). Ich werde ständig viele Punkte überprüfen müssen. Weiß jemand, ob eine dieser beiden Optionen empfehlenswerter ist als die andere oder ob es noch bessere dritte Optionen gibt?
AKTUALISIEREN:
Ich habe die beiden Methoden überprüft und matplotlib sieht viel schneller aus.
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)
was gibt,
Ray Tracing Elapsed time: 0.441395998001
Matplotlib contains_points Elapsed time: 0.00994491577148
Der gleiche relative Unterschied wurde unter Verwendung eines Dreiecks anstelle des 100-Seiten-Polygons erhalten. Ich werde auch formschön prüfen, da es sich um ein Paket handelt, das nur diesen Problemen gewidmet ist