2Dスターマップで境界線/州のエリアを生成するための適切なアルゴリズムは何ですか?


9

私は、それぞれが1つ以上の星系を所有している、異なる派閥/状態を示すかなり大きな2次元の星図を生成しようとしています。派閥の境界・エリアを自動で作成したいのですが。

アイデアは基本的にこのようなものから行くことです(ドットは2d平面上の星系を表し、色は派閥の所属です)

星系とその派閥

これに

派閥エリアのスターシステム

このようなマップを生成することはかなり一般的な要件のように思われるので、私の実際の質問はこれです:示されているように状態領域を生成するための標準的なアルゴリズムはありますか?もしそうなら、私にそれらを指摘してもらえますか?そうでない場合、良いアルゴリズムを考えることができますか?

アルゴリズムのパフォーマンスは私にとって主な関心事ではないので、生成するのが高速なマップよりも「きれいな」マップを使用したいと思います。この同様の質問は、いくつかの「整形」が必要であるにもかかわらず、おそらく私の問題に適用できるアプローチを提供します: グラフからマップを作成する方法

きれいに言うときの意味を説明しましょう。リンクされた質問の下部に、質問者は受け入れられた回答を実装した後の最終結果を提示します。ここでの最初の問題:ノード#6、#9、および#12の領域は非常に小さく、奇妙な形をしています。また、シャープなエッジの代わりに、滑らかで湾曲した外観を好むでしょう。

これまでに見たそれぞれの欠点/質問を含む、これまでの自分のアイデア:

  • 各派閥の「凸包」ポリゴンを生成し、少し外側に拡張します。問題:凹面の特徴はありません。また、オーバーラップにはどのように対処しますか?
  • ドットのボロノイグラフを生成し、隣接する異なる派閥のシステム間のボロノイポリゴンエッジを境界として使用します。問題:マップの端にある大きなポリゴン-それらを特定して修正するにはどうすればよいですか?
  • ドットごとに固定サイズのポリゴンを生成し、単一のファクションのすべてのポリゴンを結合します(結果として、1つの大きく潜在的に複雑な「ファクションポリゴン」が生成されます)。次に、2つの派閥間の重複領域を調整するために何かを行います。問題:これを正確に行うにはどうすればよいですか?単純なプロセスではありません。3つ以上の派閥間で重複がある場合はどうなりますか?

よろしくお願いします。


補遺:最初の2つの回答と問題を解決するためのそれぞれのアプローチを検討した後、上記の要件が不完全であることに気付きました。

私は、地図にまばらに人口の多いエリアがある可能性があることを追加する必要があります。これは、孤立した星または星のクラスターがある可能性があることを意味します。それらの各クラスターを、独自の隣接する色付きの領域で表示したいと思います。このようなもの:

ファクションエリア、異なるクラスターを持つスターシステム

これには、クラスターを識別する最初のステップが必要であり、次に各クラスターに対して実際のアルゴリズムを実行する必要があることを理解しています。


(ブレーンストーミング)あなたは、ブルーノイズ(例えばポアソンディスク)と宇宙の残りの部分を埋めるとすることができるかもしれないその後、色の割り当てを取得するためにボロノイを実行します。追加されたポイントには、白い背景領域が割り当てられます。
amitp

@amitpねえアミット、ここでコメントしてくれて光栄です!Red Blob Gamesの記事を読んで、非常に多くのインスピレーションと実践的な知識を取り入れました。トピックの詳細:追加のドットを生成するという考えは理にかなっています。ブルーノイズについて具体的に言及している特定の理由はありますか?
Grüse

...他のノイズのフレーバーよりも自然な分布のように見えるからだと思います。
Grüse

回答:


16

ボロノイのアイデアは良いものだと思います。各星はボロノイのシードポイントになり、ボロノイ領域は各派閥が所有するエリアを示します。ただし、動作を改善するいくつかの変更があります。

  1. あなたが言ったように、派閥に割り当てられるべきではない空の領域があります。ボロノイは、派閥が到達してはならない領域に広がる大きなポリゴンを作成します。これを修正するには、ポアソンディスクのようなブルー​​ノイズアルゴリズムを使用して、「誰も所有していない」星で空きスペースを埋めます。ブルーノイズはランダムですが、均等に分散されます(星の位置を生成するのにも役立ちます)。
  2. ボロノイは、ブロック状の領域を生成します。丸みのあるセルを作成するには、ボロノイの外心円計算を重心計算に置き換えます。これについて、比較画像を使用してここで少し書きました。
  3. ボロノイはポリゴンを生成しますが、円形の領域が必要です。各コーナーには、3つのポリゴンがあります。3つすべてが同じ派閥である場合は、そのままにしておくことができます。2つが同じ派閥である場合、境界を他の派閥にシフトする2次ベジェ曲線を導入します。3つの派閥すべてが異なる場合は、コーナーをそのままにするか、3つのベジェカーブを導入してすべての境界を互いに離すことができます。どちらが良く見えるかわかりません。

出力は次のとおりです。

メタボールマップ

また、リージョンペイントして、どのように見えるかを確認できるページ作成しました


これは私のユースケースに完全に適合します。ありがとうございました!インタラクティブな例をすぐにまとめることができたのも同様に印象的で憂鬱ですが、ここで提示した内容を再現するまでに少なくとも数日はかかるでしょう:)そのチュートリアルの記事を楽しみにしています。
Grüse

4

多くの方法の1つはインフルエンスマップです。特定のコード実装を検索できますが、基本的なアルゴリズムはかなり単純です。

各派閥オブジェクト(スターシステムなど)に、正の(ホット)値を割り当てます。他のすべての派閥のオブジェクトには、負の(コールド)値を割り当てます。暑さや寒さの大きさは、オブジェクトがその周囲や隣人に及ぼす影響の大きさに基づいている必要があります。最終的に派閥間の「dmz」を維持したい場合、これらの値は比例している必要はありません。

これらの詳細を使用して、マップのピクセルに近似する一時的なグリッド(配列など)を作成します。このようなグリッドは、1:1を含め、希望する解像度に構築できます。

次に、熱/フィールド伝達方程式を使用して、グリッド内の各隣接セルの敵のオブジェクトの強さ(寒さ)に対して、派閥オブジェクトの強さ(熱)を反復して伝達します。

それぞれの派閥グリッドを作成して、マップ上の派閥ごとに洗い流して繰り返します。

最後に、派閥グリッドを一緒に補間して、各派閥の影響の輪郭を作成します。次に、グリッドに使用した解像度(ファクション固有の色などを追加)を指定して、そのグリッドをピクセルマップに戻します。

このプロセスの技術は、各オブジェクトが持つべき影響力と、その値を定量化するために使用するゲーム要素を決定することです。

余談ですが、この方法の製品は、AIの意思決定など、他のあらゆる種類の目的に使用できます。


追加リファレンス:影響マッピングの起源に関するディスカッションスレッド


このアプローチは明白なはずですが、私には思いつきませんでした。注目していただきありがとうございます。考え:私の地図は特定の地域でまばらである可能性がありますが、他の地域は互いに隣接する異なる所属の星で密集しています。異なるエリアに異なるグリッドセルサイズを使用する方法はありますか?四分木などの線に沿って考えます。
Grüse

2

ボロノイ図を調べる必要があります。ウィキペディアの定義は次のとおりです。

数学では、ボロノイ図は、平面の特定のサブセット内のポイントまでの距離に基づいて平面を領域に分割することです。

基本ポイントは通常ランダムに生成され、ノードと呼ばれることがよくあります。あなたの場合、各ノードはあなたの星になる可能性があります。このようにして、星に関連付けられた派閥を星を囲むボロノイセルに関連付けることができます。すべてのセルが計算されると、同じ派閥を持つセルを結合し、星の周りにかなりきちんとした境界線ができるはずです。

FastNoiseライブラリはボロノイ図をサポートしているので、多分それを見るべきです。

領域の平滑化

星を「安全な配列」に保持し、そのコピーを使用して、実際に最近傍の補間によってさらにポイントを追加し、それらのポイントからダイアグラムを生成します。スムーズな領域が得られます。

その他のアイデア フォーチュンアルゴリズムは、デカルト平面をスイープする直線に基づいています。面白いアイデアは、代わりに円を使用して銀河/宇宙の中心から平面をスイープすることです。多分それはいくつかの興味深い形につながる可能性があります。

ジオメトリ操作

小さなポリゴンを大きなポリゴンに結合してからエッジを修正するという最後のアイデアでは、形状を変更するために高度なスプラインアルゴリズムが必要になります。それが効率的か見栄えが良いかどうかはわかりません。テッセレーションを追加したボロノイ図は、それ自体でエッジの問題を修正し、境界からの距離のような追加のデータを提供することもできるので、確信があります(ゾーンの決定に使用できます)異なる派閥間の衝突、異なる種類の船に遭遇する確率など)


OPは既にボロノイ図を使用して回答を参照しているため、この手法はわかっていますが、境界線の外観を変更するために特定の変更を求めていることに注意してください。これらの特定の要求に対処するために回答を拡張できますか?
DMGregory

申し訳ありませんが、誤って投稿を読みました
BadgerBadger

回答を修正していただき、ありがとうございます。平滑化のアイデアは興味深いです。ボロノイアプローチには2つの問題があります。1つ目:境界が画面の端まで伸びないように、「外側」の点を検出して制限するにはどうすればよいですか(私の質問の2番目の画像を参照)。2:人口が少ない地域では、ポリゴンが巨大になるため、ボロノイは大きな結果を出しません。たぶん、私が見落としている問題に対する明白な解決策はありますか?
Grüse

自分でポイントを追加してエリアをフレーミングするオプションはありますか?次に、グラフをレンダリングするときに、線が画像の実際の端に達した場合は、ゲームエリアの一部ではないため、単に描画しないでください。2番目の問題は、スムージングで修正できるはずです。ポイントがさらに大きくなったときにポイントを追加して、何らかの一定の「グリッドサイズ」を維持することができます。
BadgerBadger

うん@BadgerBadger、私は今、ポイントを追加することを試しています
Grüse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.