ポイントがポリゴンの内側にあるかどうかを調べる2つの主な方法があります。 1つは、最も推奨される答えであるhereを使用するレイトレーシング方法を使用しています。もう1つは、matplotlib path.contains_points
(これは私にはわかりにくいようです)を使用しています。私は多くのポイントを連続してチェックしなければならないでしょう。これらの2つのいずれかが他のものよりも推奨されている場合、またはより良い第3の選択肢があるかどうかは誰にも分かりますか?ポイントがポリゴンのポリゴンの内側にあるかどうかを調べる最も速い方法は
UPDATE:
私は2つの方法を確認し、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の側のポリゴンを用いたものを得ました。あなたは、私が唯一の二、path.contains_points
を使用しました言及した方法の中から
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
point = Point(0.5, 0.5)
polygon = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
print(polygon.contains(point))
、:それはちょうどあなたがshapelyを考慮することができる問題
matplotlibの実装がC++なので、おそらくもっと速くなると期待できます。 matplotlibは非常に広く使用されていることを考慮すると、これは非常に基本的な機能なので、正常に動作していると見なすことはおそらく安全です(「あいまい」と思われるかもしれませんが)。最後は重要なことですが、単にそれをテストしてみませんか? – sebastian
私はこのテストで質問を更新しました。予想通り、matplotlibははるかに高速です。私はmatplotlibが私が見たさまざまな場所で最も有名なレスポンスではないので心配していました。私が何か(またはより良いパッケージ)を見落としていたかどうかを知りたかったのです。また、matplotlibはそのような_simple_質問のための大きな男であるように見えました。 –