मुझे यह देखने के लिए दो मुख्य विधियाँ मिलीं कि क्या कोई बिंदु बहुभुज के अंदर है। एक यहाँ उपयोग की जाने वाली किरण अनुरेखण विधि का उपयोग कर रहा है , जो सबसे अधिक अनुशंसित उत्तर है, दूसरा माटप्लोटलिब का उपयोग कर रहा है path.contains_points
(जो मुझे थोड़ा अस्पष्ट लगता है)। मुझे लगातार बहुत सारे पॉइंट्स चेक करने होंगे। क्या किसी को पता है कि क्या इन दोनों में से कोई भी अन्य की तुलना में अधिक अनुशंसा योग्य है या यदि बेहतर तीसरे विकल्प भी हैं?
अपडेट करें:
मैंने दो तरीकों की जाँच की और मैटलोट्लिब बहुत तेज़ दिखता है।
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)
जो देता है,
Ray Tracing Elapsed time: 0.441395998001
Matplotlib contains_points Elapsed time: 0.00994491577148
समान सापेक्ष अंतर 100 पक्षों के बहुभुज के बजाय एक त्रिकोण का उपयोग करके प्राप्त किया गया था। मैं भी इस तरह की समस्याओं के लिए समर्पित एक पैकेज लग रहा है, क्योंकि मैं भी सुडौल जाँच करेगा