2011-07-27 5 views
20

私はポリゴンユニオンは簡単な操作ではありませんが、多分簡単な操作ではありませんが、多分簡単な操作では正しい方向に向けることができます。多角形は穴なしで凹形であり、また出力多角形に穴がないはずです。ポリゴンは反時計回りに表示されます。私が意味することは、写真上に提示されます。ポリゴンの結合に穴があってもわかるように、出力には必要ありません。入力ポリゴンは穴なしで確実です。私は穴がなければ簡単にするべきだと思いますが、まだアイデアはありません。 Polygons - blue and red are input, green is output穴のないポリゴンユニオン

+0

私はここで同じ質問に答えを投稿しました:http://stackoverflow.com/a/19475433/904679 – xtmq

答えて

13
  1. 明らかだ180°未満

    希望は、他の多角形の内側にあるポリゴンのすべての頂点を削除しますがhaveing角度の制約を脱ぐ:http://paulbourke.net/geometry/insidepoly/

  2. をユニオンポリゴンになることが保証されている開始点を選択してください(どちらかの極値が機能します)
  3. ポリゴンのエッジを反時計回りにトレースします。これらはあなたの組合のポイントです。交差点に当たるまでトレースします(エッジが他のポリゴンの複数のエッジと交差する場合があります)。
  4. 最初の交差点を見つけます(複数ある場合)。これはあなたの連合の一点です。
  5. もう1つのポリゴンで手順3に戻ります。次のポイントは、前のエッジと最大の角度をなすポイントでなければなりません。
+1

あなたの解決は素晴らしいですが、私は現在のエッジと同じ行にある他のポリゴンに "ジャンプ"しなければならない問題があります。どのエッジを選択するかはわかりませんが、時には2番目のポリゴンのエッジをたどる必要があります。 – Pax0r

3

あなたは以下のように進めることができます。

は、最初のポイントのあなたのセットにあなたの多角形の交点のすべてのポイントを追加します。

私はgraham scan algorithmのように進みますが、もう1つの制約があります。

前の行と最も高い角度をつける点を選択する代わりに(グレアムスキャンを見て(私が何を意味するかを見てください)、前の行の1つの一部であった角度が最も大きいものを選択しますポリゴン。

あなたの形状を説明するエンベロープ(凸ではない)が得られます。

注:

それはあなたのポイントの凸包を見つけるに似ています。

たとえば、graham scan algorithmは、O(N * ln(N))の点集合の凸包を見つけるのに役立ちます(Nは点の数です)。

凸包アルゴリズムをルックアップすると、いくつかのアイデアが見つかります。

希望します。

remarques:

(*)ウィキペディアから:

このアルゴリズムの最初のステップは、最も低い -y座標を有する点を見つけることです。最も小さいy座標が集合内の複数の点 に存在する場合は、 候補の中から最も低いx座標を持つ点を選択する必要があります。このステップは、O(n)、 が必要です。ここで、nは問題のポイントの数です。

次に、ポイントのセットは、それらの角度の昇順にソートされなければならず、ポイントPはx軸で作成されます。例えば、ヒープソート( はO(n log n))などの任意の汎用の ソートアルゴリズムがこれに適しています。計算を高速化するために、これらの点が x軸で実際の角度を計算するために必要なのは ではありません。代わりに、この角度の余弦を計算することで十分である。 は、問題のドメイン (最初のステップにより0〜180度)で単調に減少する関数であり、単純な算術で計算された であってもよい。

凸包アルゴリズムでは、前側と最大の角度をなす角度の点を選択しました。

以前のポリゴンに「スティック」するには、以前に存在していた面を選択するという制約を追加するだけです。

と私は

+0

いいえ、例の結果は凸ではありません。 – Henrik

+0

@henrik、私は自分の投稿を編集しました –

+0

"これは以前のポリゴンの一つであった最高の角度を持つものを選んだ" - これは不明だと思います。あなたは詳しく説明できますか? – tskuzzy

0

私は完全な答えはありませんが、私は同様の問題に着手しようとしています。私はかなり重要な2つのステップがあると思います。最初に、外側のエッジにあるポリゴン上の点を見つけることです。もう1つは、すべての頂点の境界ボックスのリストを作成し、これらの重なりのどれを見るかです。これは、頂点を反復処理するときに、すべてのテストを行う必要はなく、交差する可能性があることを知っているものだけです(バウンディングボックスの問題は軽量です)。

外部ポイントが追加されたので、交差点を検出するまで接続ポイントを繰り返し処理できるようになりました。どちらの側が内側でどちらが外側かを知っている場合(これを知るには最初の頂点でいくつかの作業が必要な場合があります)、交差点をどのように進むかが分かります。それは単なるポリゴンの切り替えの問題です。

この穴を維持したい場合は、少し面白くなります。この場合、私はおそらく私が交差しているすべての境界ボックスを使い果たしたかどうかを確かめるでしょう。また、ポリゴンがまったく交差しない場合に何が起こるべきかを指定しませんでした。しかし、それはそれらを単独で残すか(1つのポリゴンが出てくることが予想される場合には問題になる可能性があります)、またはエラーを返します。