web-dev-qa-db-ja.com

可能な限り最小のポリゴンにエッジを割り当てるアルゴリズム?

私は手続き型の都市ジェネレーターを設計しています。生成プロセスの最初のステップは、街路の作成です。これらの道路はまっすぐに一点に伸びており、分岐したり、回転したり、同じ方向に進むことができます。通りが別の通りにぶつかる場合は、成長を停止するか、最も近い交差点に接続することができます。

私はジャンクションを頂点として、ストリートをエッジとして考えてきました。このことから、ネットワークを可能な限り最小のポリゴンのコレクション、つまり四方を通りで囲まれたスペースに分割できるはずです。

通りの両側に2つのジャンクションがある限り、それをポリゴンのエッジとして使用したいと思います。 「行き止まり」であるストリート(エッジが1つしか接続されていない頂点)を処理前に検討対象から除外するため、問題にはなりません。

それで、頂点とエッジのコレクションを考えると、それらを可能な限り最小のポリゴンに分割するための良い方法は何ですか?ポリゴンが凸面であるか凹面であるかは関係ありません。これは主に、都市のビットをロードし、エリアをロードまたはアンロードとしてマークし、シミュレーションのために都市のビットを選択的に選択する方法として使用されるためです。半無限のマップを可能にするために、実行時に新しい領域を作成できることも重要です。

あなたは私の急いで一緒に投げられたイメージを許さなければならないでしょう、しかし私がこのように見えるネットワークを持っていると言います:

出力で次のようなものを生成したいと思います。

私はこれを自分で達成しようとしましたが、いくつかの問題がありました(主に、エッジが2つのポリゴンによって「共有」されるかどうかを決定することになったとき)-上記の例では、エッジFはAEFとFGMOL、AはAEFにのみ属します)。

これはグラフィックス業界では一般的な問題のように思われるので、すぐにアクセスできるアルゴリズムがあるはずだと考えました。 Andrewの単調チェーンアルゴリズム を見ましたが、逆のようです(一連のポイントから最大のポリゴンを返します)。

私がこれを完全に間違った方法で見ている可能性があるので、どんな助けもいただければ幸いです。これを間違ったセクションに投稿した場合の私の謝罪-この質問をStackOverflowに投稿しようとすると、ここにリダイレクトされました。

ありがとうございました!

4
Jay2645

アルゴリズムについては、 ここ を参照してください。各無向エッジを実際には2つのエッジと見なし、1つは各方向に進みます。基本的に、各頂点の周りのエッジを角度順に並べると、各面を時計回りに歩き回ることができ、歩きながら各エッジを交差させます。次に、クロスされていないエッジを選択し、それから歩き回ります。

ただし、グラフを生成するのはあなたなので、最初に顔を生成する方が簡単な場合があります。マップのエッジの頂点に到達したら、左に曲がり、最初の右を進み続けて外側のエッジをたどります。次に、右に分岐し、元の頂点に戻るまで時計回りに回り続けます。元の頂点を含まないループを作成しないように注意してください。次に、おそらく顔を1〜2回分割します。

4
Karl Bielefeldt