Ich habe zwei Hauptmethoden gefunden, um zu sehen, ob ein Punkt innerhalb eines Polygons gehört. Man verwendet die Ray-Tracing-Methode here, die die am meisten empfohlene Antwort ist, die andere verwendet Matplotlib path.contains_points
(was mir etwas dunkel erscheint). Ich werde viele Punkte kontinuierlich prüfen müssen. Weiß jemand, ob einer dieser beiden empfehlenswerter ist als der andere oder ob es noch bessere dritte Möglichkeiten gibt?Was ist der schnellste Weg zu überprüfen, ob ein Punkt innerhalb eines Polygons in Python ist
UPDATE:
Ich habe die beiden Methoden und matplotlib sieht viel schneller.
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)
, die
Ray Tracing Elapsed time: 0.441395998001
Matplotlib contains_points Elapsed time: 0.00994491577148
gleiche relative Unterschied gibt man erhält ein Dreieck statt der 100 Seiten Polygons verwendet wird. Ich werde auch formschön überprüfen, da es ein Paket sieht nur auf diese Art von Problemen gewidmet
Da die Implementierung von Matplotlib C++ ist, können Sie wahrscheinlich erwarten, dass es schneller ist. Wenn man bedenkt, dass Matplotlib sehr weit verbreitet ist und da dies eine sehr fundamentale Funktion ist, ist es wahrscheinlich auch sicher anzunehmen, dass es richtig funktioniert (auch wenn es "obskur" erscheint). Last but not least: Warum nicht einfach testen? – sebastian
Ich aktualisierte die Frage mit dem Test, wie Sie vorhergesagt haben, Matplotlib ist viel schneller. Ich war besorgt, weil Matplotlib nicht die bekannteste Antwort an den verschiedenen Orten ist, an denen ich geschaut habe, und ich wollte wissen, ob ich etwas übersehen habe (oder ein besseres Paket). Auch Matplotlib schien ein großer Typ für eine so einfache Frage zu sein. –