島の領域を手続き的に生成する


29

現在、次のような島があります。

島

そして、次のように手続き的に領域に分割します。

地域のある島

私が探しているのはどのアルゴリズムですか?下の写真のように、一貫性のある領域を作成する方法について提案がありますか。あなたの助けに感謝します。


そもそもどうやってその島のイメージを手に入れたのですか?あなたはそれを生成しましたか?もしそうなら、どのようにそれを達成しましたか?
ベイランクール

オンラインマップジェネレーターから取得しました。
ドミサム

回答の更新が遅れて申し訳ありません。家に帰るのに当初の計画よりも時間がかかりました。イラストとリンクを追加しました。
ピカレック

これをオンラインジェネレーターから取得した場合は、AzgaarのFantasy Map Generatorご覧ください。カスタマイズ可能なパラメーターを持つリージョンと名前があり、WB.SEは挨拶します。これはGitHubなので、コードを確認できる場合があります。
アノプレキシアン-モニカを

回答:


40

現実の世界では、これらの州境はしばしば川のような地質学的特徴をたどっています。

島の地質をモデル化し、境界線をこれから外すのが良いアプローチでしょうか?

Red Blob Gamesには、このテーマに関する優れた記事があり、見栄えの良い結果が得られています。

彼のアプローチは、ボロノイテッセレーションの使用を含み、川をセル間の境界として定義しているようです。

彼のサイトの他の記事をチェックしてください。彼はマップ生成のテーマについて多くの記事を書いています。

島


3
現実の世界では、政治的または行政的な区分には、通常は直線(たとえば、緯度/経度の線、山頂間の線など)の任意の区分もあることに注意してください。
パブロH

2
@PabloH良い点ですが、まっすぐな境界線は中世後の植民地時代の現象のようです。しかし、私たちはOPの問題の設定を知らないので、関連があるかもしれません
セントリー

27

ボロノイ図の2つのパスでこの問題を解決します。

最初のパス:領域分割

最初のパスでは、島を領域に大まかに分割するために、ポイントのややまばらな分布を使用します(つまり、ポイント間の距離は比較的大きくする必要があります)(ポイント生成に関する以下のメモを参照)。次に、これらの点に基づいてボロノイ図を生成します。これにより、以下に示すように、各ポイントの周りに島が多角形の領域に分割されます。

ここに画像の説明を入力してください

2番目のパス:境界のランダム化

島が地域に分割されたので、次のステップはそれらの間の境界を「粗くする」ことです。そのためには、ポイントのよりコンパクトな分布を使用してポイントの新しいレイヤーを生成し(つまり、ポイント間の距離を小さくする必要があります)、これらのポイントを使用して別のボロノイ図を作成します。次に、小さな領域ごとに、「シード」ポイントをチェックして、大きな領域に割り当てます。これにより、より大きなサブディビジョン間の境界がよりぎざぎざになります。両方のボロノイ図が適切に配置された状態の詳細を次に示します。

ここに画像の説明を入力してください

そして、最後の境界のみを表示している同じ領域があります:

ここに画像の説明を入力してください

ポイント生成に関するコメント

ポイントの生成に関しては、ポアソンディスク分布を使用して、ポイントを比較的うまく均等に分布させるのが好きです。他の一般的なオプションは、同様に均等な分布を取得することです。「通常の」ランダムポイントのセットでロイドのアルゴリズムを使用します。LLoyd'sはコーディングが簡単ですが、試行錯誤を繰り返して、目的の結果を得るために必要なパスの数を判断できます。

このアプローチの潜在的な問題の1つは、最初のパスのパーティション分割で非常に小さな領域が生成される可能性があることです。最終結果でそれらが必要ない場合は、ランダムな隣接領域に単純にマージします。

最終ノート

私が提供したイラストはたまたまラスター画像ですが、この手法は多角形/ベクトル表現でも機能します。


1
手続き型のフロアプランの場合、これが私が行うことです。リージョン(島)内のポイントからボロノイ図を作成し、同じリージョンを囲むグリッド(長方形である必要はありません。変形グリッド)を構築します。次に、グリッドとボロノイのブール交差を計算し、面積を計算して、最小のグリッドセルの0.6パーセントに従ってデータツリー(リストのリスト、ジャグ配列など)に割り当てます。不足しているセルがいくつかありますが、カリングされたグリッドを元のグリッドと比較して、ツリーを見つけて再割り当てすることができます。
フェリペグティエレス

画像を追加しました!これは私が別の目的のためにやっている正確に何である
フェリペ・グティエレス

4

MineCraftはこれをうまく行い、その世界生成アルゴリズムは徹底的に分析および文書化されています。

アルゴリズムにはさまざまな説明がありますが、そのうちの1つはhttps://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithmです

アルゴリズムの中核は、Perlinノイズジェネレーターです。これは、バイオームの生成と同様に、標高(多かれ少なかれ、洞窟を切り開くための次のステップでも表面を変更できるため)を直接制御します。バイオームジェネレーターのようなものは、おそらくあなたがあなたのエリアを作成するために使用したいものです。

(古いバージョン)が文書化されており、基本的には、2つの異なるPerlinノイズジェネレーターを使用して動作します。変数自体(温度と降水量)は、後でゲームで実際には使用されません。たとえば、砂漠には雨はありませんが、ゲームはこれを元の降水量ではなく「砂漠」プロパティから決定します。

ランダムシードからバイオームマップを生成するためのさまざまなオンラインツールがあり、そのうちの1つがmineatlas.comです。内部的には、MineCraft自体の内部クラスを使用するJavaサーバーを使用していると思います。それらのソースコードが直接利用できるかどうかはわかりません。


4

たとえば、Azgaarが使用する典型的なアルゴリズム(ソースコード)。おおよそ次のようなものです:

  1. 陸地を小さな領域に分割します。たとえば、三角測量やボロノイセルを使用します。
  2. 文化、レルム、宗教、またはシミュレートしたいその他のものの「開始」場所を(ランダムに、または別の方法で)決定します。
  3. それらのそれぞれの「成長因子」を(ランダムまたはその他の方法で)決定します。成長因子の差が大きいほど、最終的なマップの均一性は低下します。
  4. 次に、レルム(など)を反復処理し、成長因子に応じて、マップ全体がいっぱいになるまで周囲の空のタイルにそれらを広げます。
  5. おそらく、自分の色の隣人が1つだけで、それ以外の場合はその色とは別のセルに囲まれているセルを切り替えることで、境界線を少し真っすぐにしたいと思うでしょう。

3

ラスターベースのアプローチではなくベクトル形式でこれを行うことに興味がある場合は、これについてかなり前にブログ投稿を書きました。

http://blog.particracy.com/worlds-and-their-geography/

アイデアは、メッシュ(通常はボロノイベース)から始めて、十分に間隔を空けてランダムにシードされたポイントから同心円状に領域を成長させることです。


2

なんて楽しい質問でしょうか?)このアプローチは、Vornoiセルに基づいていますが、距離メトリックはユークリッドではなく(2.0ではなく1.5の累乗を使用しました)、ランダム性が組み込まれています。それは理想的ではない水を飛び越える可能性があります。

近くの領域をマージして、より興味深い形状を得ることができます。ここでは、これを決定するためにN個の最近傍を使用しました。

興味があれば、詳細を調べてPythonコードを共有できます。

地図1 地図2

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