ランダムマップの生成-ランダムノードの分散/クラスタリングの戦略


10

私は、単純な4Xストラテジーゲームを空間で実行しています。各ノードは、目的点(惑星、小惑星など)です。

マップをランダムに生成するには、以下の手順に従います

  1. マップが持つ各ノードのタイプの数を決定します(たとえば、5つの地球のような惑星、10の不毛の惑星など)。

  2. 各タイプのノードをマップに配置します。

ステップ2では、各ノードタイプを均等に分散させたいと思います。したがって、たとえば、私はすべての地球のような惑星を配置することから始めます。単純にrand(map.width、map.height)を実行して位置を決定すると、すべての地球に似た惑星が一緒にクラスター化し、その領域から開始するプレーヤーにメリットをもたらす可能性があります。

さまざまなグラフ関数やノイズ関数を使用するなど、相互に広がる一連の(x、y)座標を生成できる方法はありますか?同様に、互いに近い座標を生成する方法はありますか?


1
自分のものか他人のものかを問わず、回答を承認済みとしてマークしてください。ありがとう。
エンジニア、

回答:


8

あなたが直面している問題は、ランダムな選択は区別されないということであり、それはそれがあなたがする必要があるものに対して理想的ではない適合であることを意味するかもしれません。しかし、これを回避する簡単な方法が少なくとも1つあります。

  1. スペースをセクターに分割します(たとえば、100 x 100の面積があり、これらのソーラーシステムを100個生成する必要がある場合、エリアを10 x 10グリッドのセクターに分割します)。

  2. 各セクターをループし、ステップ3を繰り返します(これにより、ステップ4が複数回繰り返されます)

  3. 現在の太陽系の惑星の数をランダムに決定します(たとえば、3から7の範囲の惑星の場合、0から4の範囲の乱数を取得し、3を追加します)。現在のセクター(複数の太陽がある場合)セクター内のシステム、これは別のループを設定する場所です)

  4. ループによって識別された現在の太陽系内の惑星をランダムに割り当てます(乱数を使用して惑星間の最小距離を増やすこともできます)。ここで惑星のタイプを決定します。これは、さまざまな重みや使用したい方法でランダムに決定することもできます

また、各セクターの端の周りに「境界外」の領域を定義して、隣接するセクターの惑星が互いに直接接触しないようにすることもできます(事実上、ランダムに並んでいる場合)。 ..

別の解決策は、各太陽系および/または各惑星の位置を決定する時点で、隣接するセクターに対して迅速な近接チェックを実行し、それに応じて調整することです(たとえば、最小距離にランダムな距離を加えた距離だけエッジから離れる)。 )。


どういたしまして!そして、あなたの問題を解決したものについてのフォローアップを投稿するための+1。=)
ランドルフリチャードソン2011

8

均等に分散するための最良の方法は、各ノードを一種の物理的な粒子として扱うことです。最初に、連続した(浮動小数点の)xy平面にランダムに分布します。平面上の個々の粒子の個々のペアの間に反発力を適用することにより、ゆっくりと離れて分散することがわかります。ある意味では、衝突解決のようなものであり、実際に接触することはありません。その場合、その平面を変換(「ラスタライズ」)して、整数のインデックス付きグリッドに戻すのは簡単です。最初は、これを整数インデックスグリッドから簡単に実行できますが、「素敵な」ものを取得するのは少し難しいかもしれません。これは、グリッドの解像度の高さに依存します...高いほど、良い、 この場合。

当然、正方形の平面の端からもある種の力を加えたいと思うかもしれませんし、そうでなければ多くの粒子が「岸を洗い流す」ことに気付くかもしれません。または、必要以上に大きいフィールドを作成し、その小さな領域のスナップショットを取得することもできます。これにより、前述の問題を回避できます。

逆のこと、つまりクラスタリング発生することを確認したい場合、「標準」または「ガウス」分布を調べます。これが、ランダムに生成されたスターフィールドが偽物に見えることが多い理由です。より自然な分布モデルではなく、純粋なランダム分布を使用します。


1
「物理」モデルからクラスタリングの動作を取得することもできます。別のルールセットを使用する必要があるだけで、引力と反発力を組み合わせて使用​​できます。オプションは無限大です。適切なモデルを見つけるだけです。
aaaaaaaaaaaa 2011

6

単純なポアソンディスク分布アルゴリズム使用して、「ブルーノイズ」分布を取得できます。これにより、互いにほぼ等間隔に配置された平面内のポイントが生成されます。これは、2Dの例だけでなく、3Dでも、また非ユークリッド空間でも機能しますが、計算がすぐに扱いにくくなる可能性があります。

これらのアルゴリズムの基本的な考え方は、最初の「シード」ポイントから始めて、外側に向かって、ポイントからの最大距離と最小距離の間にある環状部にランダムまたは疑似ランダムポイントを追加して削除するというものです。お互いに近すぎるもの。次に、必要な量のポイントが追加される(これにより、おおよそ円形の点群が得られる)か、使用可能なスペースがいっぱいになるまで、アルゴリズムはこのような方法で外側に向かって機能します。

このような2Dノイズを生成するための高速でエレガントな代替アルゴリズム、およびその特性の簡単な説明は、大学のDaniel DunbarとGreg Humphreysによる「高速ポアソンディスクサンプル生成のための空間データ構造」にあります。バージニア


2
ポアソンディスクの配布について聞いたことがありません-良いリンク!
tenpn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.