16進マップで等しい領域を生成する


13

たとえば、大きな(X x Y)ヘックスマップを使用して、国をシミュレートするために、それを接続されたヘックスのN領域に分割するにはどうすればよいですか?

目標は、形状は異なるがサイズが等しい国を含む現実の地図のように見える16進マップを生成することです。

回答:


13

ロイドのアルゴリズムを試しましたか?手順は非常に単純で、実行する反復の数に応じて、かなり規則的な外観の領域を生成します。

  1. 開始するには、空のヘックスでマップをタイルします。
  2. Nヘクスをランダムに選択します。これらは、各国の「重心」を表します。
  3. 各ヘクスに最も近い中心ヘクスをタグ付けします(ボロノイ図)。国iは、i番目の中央ヘクスに最も近いすべてのヘクスのセットです。
  4. 各国の新しい重心を計算します。
  5. 生成された領域を滑らかにするために、必要な回数だけステップ3と4を繰り返します。

見栄えの良いマップを作成するために、それほど長く実行する必要はありません。 この例では、3回の反復のみが必要でした。


非常に素晴らしく、特に例を持っているために+1ですが、これらが少し規則的すぎると少し心配します!とはいえ、結果は特にその規模で本当にゴージャスに見えます。また、他の方法をシードする優れた方法でもあります。
スティーブンスタドニッキー

1
私の例は、ポリゴンマップ生成に関するブログ投稿に触発されました。著者は、各領域のエッジにノイズを追加して、よりギザギザに見えるようにしました(下にスクロールして表示します)。それを実行可能なオプションにするために、私よりもはるかに多くのヘクスを使用する必要がありますが、それは確かに実行可能です。
マイケルクリストフィック

3

あなたが試すことができる1つの簡単な方法。

  1. nヘクスをランダムに選択します。それぞれがグループを開始します。
  2. グループごとに、ランダムな方向に最初のヘックスを拡大してみてください。
  3. 選択したヘクスの周囲のすべてのヘクスが占領されている場合、タップ済みとしてマークし、ヘクスを変更します。
  4. 各グループが20ヘクスの長さになるか、拡張するスペースがなくなるまで繰り返します(すべてのヘックスがタップされます)。

私はテストしませんでしたが、これにより島が生成され、長く細いブレースがいくらか回避されるはずです。また、ほとんどの場合、隣接する境界線がありますが、必ずしもそれぞれが他の境界線と接触するわけではなく、その密度はの値に依存しますn
一部のグループは他のグループに追い込まれ、サイズが20未満に達する場合があります。スターターヘクスを最短距離でスポーンすることで、スペースを拡大できます。
必要に応じてテストおよび微調整します。


また、ではない。この問題に関連しているがヘクスでの作業に非常に、非常に便利な、このページを参照してください。http://www.redblobgames.com/grids/hexagons/#basics
それはと1つの場所で、六角情報の全体の束を集約します素晴らしいビジュアル。


グループBがグループAに隣接し、他に行く場所がない場合は、おそらくグループAがグループBにノードを提供するためのメカニズムを含める必要があります。グループAが、失われたノードを置き換えるために拡張する空のスペースを持っている限り。その後、彼らがどこから始めたのかは問題ではありません。これは一種の「後退」のように機能するためです。
マイケルハウス

一度に国を始めて、最初にコーナーグループを形成し、次にエッジグループが私が望むものを提供するだろうと考えています。家に帰ってからやってみます。
MadCatPT

@ Byte56ええ、私は実際に昼食時にこのようなことを少し考えました。角のあるグループが成長する場所がない場合は、別のグループのヘックスを取り、次の反復でそのグループに空きスペースを見つけさせます。ただし、2つのグループが互いに無限にいじめられないように、ある程度の安全対策が必要です。
petervaz

現実の国では、川や山の境界がしばしばあります。ランダムな方向に拡張しているため、次のヘクスが川または山の尾根の反対側にある場合、拡張の可能性を減らしてみてください。
amitp

@amitp OPがこれらの要因が説明されることを期待していたなら、おそらくそれらに言及したでしょう。私は想定していません、元の前提の中で働いているだけです。
petervaz

2

何らかのタイプのグラフ構造がこれを可能にすると確信しています。基本的に、マップ全体をシミュレートするために2つのHexノードが隣接している場合は、それらの間にエッジを作成します。ただし、そのマップ内で「国」を生成するための正確なアルゴリズムはわかりません。問題は、国に「見せる」方法に応じて、異なるアルゴリズムが必要になることです。

頭上から、ポイントを選んでそこから外側に移動し、国の一部ではない隣接するタイルがある「成長する国」内のランダムなタイルを選ぶことをお勧めします。

戦略パターンを使用して、希望する国のタイプに応じてアルゴリズムを切り替えることができます。http://en.wikipedia.org/wiki/Strategy_pattern つまり、チリのような細い海岸線の国が欲しいですか?それとも、もっと丸くて閉じ込められたものが欲しいですか?

グラフのプロパティを使用すると、最終的な「国」を次のように調整することもできます。http//en.wikipedia.org/wiki/Eccentricity_(graph_theory)

大きな国が欲しいですか?グラフのプロパティを微調整し、生成された国(単なるグラフ)に必要な「外観」を与えるプロパティを強制します。

最後になりましたが、グラフは国間の境界を定義するのにも非常に役立ちます。国同士が隣接している場合、2つのノード間の接続を持つグラフを作成できます。これはゲーム内のある種のパーティショニングに役立ち、開発中に特定のものをさらに最適化できる可能性があります。


2

1つの小さなメモ:「形状は異なるがサイズが等しい国の実生活の地図のように見えます)が、「実際の」国は特定の地域内であってもサイズが大きく異なります。ヨーロッパの「大きな」国でさえ、たとえば、フランスはイタリアの2倍以上です。そうは言っても、サイズをほぼ同じにしようとするゲームプレイ領域は明らかにあります-ここで少し変更することはおそらく良いことであることに注意してください!

問題に対する私の最初のアプローチは、地域を「成長させる」のではなく「進化させる」ことです。

  • 地図を直線でほぼ同じサイズのチャンクに具体的に分割することから始めます(たとえば、6か国が必要な場合は、地図を3つの水平スライスに分割し、それらの各スライスを「対角線上」に分割します2つの部分に)。これは、特に非常に正確である必要はないので、プログラムで行うのは明らかに簡単です(実際、おそらく非常に正確であるべきではありません)。
  • 部門で最初のパスを行い、「境界」データ構造を構築します。これは、現在別の国に属している隣人がいるヘクスのセットです。これは、各国にいくつのヘクスがあるかを数える良い機会でもあります。

ここで、必要な限り、次の擬似コードを実行します。

Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
  change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
  change hex B to belong to A's country;
} else {
  flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
  undo and reject this move;
} else {
  update the boundary list around the changed hex and its neighbors;
}

これにより、任意の2つの近隣国のサイズの大まかなバランスが維持され、「切断」チェック(単純なフラッドフィルアルゴリズムで実行可能)により、どの国もバラバラにならないことが保証されます。境界リストの更新は一定時間の操作です-変更されたヘックスは常に境界上にあり、6つの隣接セルをチェックして、いずれかの境界セルになったかどうかを確認できます(隣接セルは現在別の国)または境界セルになるのをやめ(隣国は現在同じ国にあるため)、必要に応じて境界セットを変更します。

このアプローチを改良するために、変更するヘックスの条件を少しランダム化することもできます-2つの国を常に「バランスさせる」のではなく、常に特定の確率でスワップを行い、その確率を徐々に減少させることさえできます(シミュレーテッドアニーリングアルゴリズムの冷却プロセスと同様)、それらをほぼ同じサイズに強制し始めます。

これは、すべてのエリアがまったく同じサイズであることを保証しないことに注意してください(Nがグリッドサイズを完全に分割しない限り不可能です)。また、すべての国がエリア内で互いに1ヘクス以内にあることも保証しません。ただし、各国が隣接国のそれぞれよりも1ヘクスだけ大きくも小さくもならないこと保証する必要があります(十分な反復回数で実行)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.