2017-06-06 19 views
1

ポリゴンの内部とポリゴン上のすべての点を見つける必要があります。多角形内のすべての座標をPythonの細長いポリゴンから抽出します

入力:

from shapely.geometry import Polygon, mapping 
sh_polygon = Polygon(((0,0), (2,0), (2,2), (0,2))) 

出力:

(0,0) , (1,0) , (2,0) , (0,1) , (1,1) , (2,1) , (0,2) , (1,2) , (2,2). 

shapelyを使用することなく、より良い方法がある場合にお勧めしてください。

多角形の内部にポイントを与えるこのコードを書いていますが、ポイントを付けることはできません。

from shapely.geometry import Polygon, Point 

def get_random_point_in_polygon(poly): 
    (minx, miny, maxx, maxy) = poly.bounds 
    minx = int(minx) 
    miny = int(miny) 
    maxx = int(maxx) 
    maxy = int(maxy) 
    print("poly.bounds:", poly.bounds) 
    a = [] 
    for x in range(minx, maxx+1): 
     for y in range(miny, maxy+1): 
      p = Point(x, y) 
      if poly.contains(p): 
       a.append([x, y]) 
    return a 


p = Polygon([(0,0), (2,0), (2,2), (0,2)]) 
point_in_poly = get_random_point_in_polygon(p) 

print(len(point_in_poly)) 
print(point_in_poly) 

出力:

poly.bounds: (0.0, 0.0, 2.0, 2.0) 
1 
[[1, 1]] 

私が簡略化されてきた私の問題も同じことを行うには良い方法があります。実際には、コーナーのある四角形の内側と内側にあるすべての点を見つける必要があります(77,97)、(141,101)、(136,165)、(73,160)です。

+0

最大値を1ずつ増やし、最小値を1減らすことができますか? – SirParselot

+0

@SirParselot Thansk。私はそれを変えた。しかし、私はまったく同じ出力を得ています。 – Beginner

+0

これは 'if poly.contains(p)'を持っているからです。これは、ポリゴンの内部にポイントがあり、ポリゴンにポイントがない場合にのみ当てはまります。ループが境界の間にある場合は、ポリゴンの内側にあるかどうかを確認する必要はありません。もしあなたが 'poly.contains(p)'を取り除くなら、私の最初のコメントは無視してください。 – SirParselot

答えて

0

にある格子点を見つける関数はありませんか?それらはあなたが欠けている唯一のものです。それらは単に線分の定義式の解です。そうでない場合は、アルゴリズムを自分で作成して、ブルートフォースでポイントを見つけるのは簡単です。

ポリゴンの各エッジ(p1、p2)に対して以下を実行します。 、これは特にエレガントではないなど、X1 <×2(またはその他の適応)は、垂直セグメントを処理していることを確認しますが、実装が容易高速です:

p1 = (x1, y1) 
p2 = (x2, y2) 
xdiff = x2 - x1 
ydiff = y2 - y1 

# Find the line's equation, y = mx + b 
m = ydiff/xdiff 
b = y1 - m*x1 

for xval in range(x1+1, x2): 
    yval = m * xval + b 
    if int(yval) == yval: 
     # add (xval, yval) to your list of points 

私はあなた次第詳細を残してきました簡単にデバッグできます。

+0

私はあなたの方法を使用して、ポリゴン上にあるポイントを見つけ、自分のコードを使用してポリゴンの中にあるポイントを見つけることを提案していますか? – Beginner

+0

はい。代わりに、私のアルゴリズムを使ってポリゴンの各列のx値の境界点を見つけて、各列に沿って繰り返します。しかし、内部ポイントを見つけるための便利な呼び出しが既にあるので、なぜそれを気にしますか? – Prune

+0

すべてのポイントを自分で見つけることにした場合、どの方向がポリゴンの内部かを知り、計算されたyvalをその方向に丸める必要があることに注意してください。これらのyvalは、ポイントの各列の限界を形成します。 – Prune

関連する問題