web-dev-qa-db-ja.com

ポイントが任意の形状の内側にあるかどうかを判断しますか?

ポイントの座標が与えられた場合、それが任意の形状内にあるかどうかをどのように判断できますか?

形状は点の配列によって定義されます。形状が「閉じている」場所がわかりません。本当に助けが必要なのは、形状が閉じている場所を特定することです。

これが私がもう少し良い意味を説明するための画像です:

enter image description here

19
gibo

それを行う最も簡単な方法は、そのポイントから光線をキャストし、それが境界を越える回数を数えることです。奇数の場合、ポイントは内側にあり、ポイントは外側にあります。

ウィキ: http://en.wikipedia.org/wiki/Point_in_polygon

これは多様体形状に対してのみ機能することに注意してください。

29
Mikola

点Pが任意の形状であるかどうかを判断する場合は、Pから開始して塗りつぶしを実行します。塗りつぶしが事前に決定された境界ボックスを離れる場合は、形状の外側にあります。そうでなければ、あなたのフラッドフィルが終了した場合、あなたは形の中にいます:)

最大面積はN ^ 2に比例するため、このアルゴリズムはO(N ^ 2)であると思います。ここで、Nはポイントの数です。

ウィキペディア: Flood Fill

1
tskuzzy

実際、点の配列が与えられている場合、次のように形状の近さを確認できます。
配列で指定された点_P[i]_と_P[i+1]_のペアを検討してください。これらは形状の境界のセグメントを形成します。チェックする必要があるのは、交差する2つのそのようなセグメントが存在するかどうかです。これらは、O(N^2)時間でチェックできます(そのようなセグメントのすべての可能なペアをチェックするだけです)。交差点がある場合は、シェイプが閉じていることを意味します。
注:セグメント_P[0],P[n-1]_もチェックすることを忘れないように注意する必要があります(つまり、配列の最初と最後のポイント)。

0