점이 다각형 내부에 속하는지 확인하는 두 가지 주요 방법을 찾았습니다. 하나는 여기에 사용 된 광선 추적 방법을 사용 하는 것인데, 이는 가장 권장되는 대답이고, 다른 하나는 matplotlib를 사용 path.contains_points
하는 것입니다. 계속해서 많은 포인트를 확인해야 할 것입니다. 이 두 가지 중 하나가 다른 것보다 더 권장되는 것이 있는지 또는 더 나은 세 번째 옵션이 있는지 아는 사람이 있습니까?
최신 정보:
두 가지 방법을 확인한 결과 matplotlib가 훨씬 빨라졌습니다.
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 개의 변 다각형 대신 삼각형을 사용하여 동일한 상대적 차이를 얻었습니다. 이런 문제들에 딱 맞는 패키지로 보여서 매끈하게 확인하겠습니다