ホームページ > バックエンド開発 > C++ > 修正されたダイヤモンド スクエア アルゴリズムを使用して現実的な島を生成するにはどうすればよいですか?

修正されたダイヤモンド スクエア アルゴリズムを使用して現実的な島を生成するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-07 12:27:45
オリジナル
444 人が閲覧しました

How to Generate Realistic Islands Using a Modified Diamond-Square Algorithm?

円のないパーリン ノイズ アイランド

グラデーション円を使用する代わりに、いくつかの変更を加えたダイヤモンド & スクエア アルゴリズムを利用して自然に見えるものを作成することを検討してください。マップジェネレーター内の島々。

ダイヤモンド & スクエア変更を加えたアルゴリズム

  • 生成プロパティの構成: 最大標高と最小標高、海抜、植生範囲などのパラメーターを確立します。
  • 地形高さマップを作成する(zed[][]):

    • コーナーを最も低い標高で初期化し、「内陸」の地形を避けるようにダイヤモンドとスクエアのアルゴリズムを変更します。
    • 最初のダイヤモンドを無視します。ステップを実行し、ランダムな値で中点を初期化します。
    • 各正方形の反復後、境界点を最小値に調整します。 (水中) 標高。
  • 表面マップの作成 (typ[][]):

    • ベースの表面フィーチャの割り当て水、砂、植物、岩などの標高。
    • 追加岩などの地形の傾斜に基づくフィーチャ。
    • 特定のルールに基づいて、川、小川、建物などの追加要素を含めます。

例C実装

void map_random(int _xs, int _ys) {
  // Configuration and parameter initialization

  // Terrain generation
  ter=new int*[mys+1]; for (y=0;y<=mys;y++) ter[y]=new int[mxs+1];
  typ=new int*[mys+1]; for (y=0;y<=mys;y++) typ[y]=new int[mxs+1];
  ...

  // First pass
  t=-r2;
  ter[  0][  0]=t;
  ter[  0][mxs]=t;
  ter[mys][  0]=t;
  ter[mys][mxs]=t;
  ter[dy2][dx2]=r2;

  ...

  for (;dx2|dy2;dx=dx2,dx2>>=1,dy=dy2,dy2>>=1)    // subdivide step until full image is filled
  {
    ...
    // diamond (skip first one for islands)
    if ((!_island)||(dx!=mxs))
     for (y=dy2,yy=mys-dy2;y<=yy;y+=dy)
      for (x=dx2,xx=mxs-dx2;x<=xx;x+=dx)
       ter[y][x]=((ter[y-dy2][x-dx2]+ter[y-dy2][x+dx2]+ter[y+dy2][x-dx2]+ter[y+dy2][x+dx2])>>2)+Random(r)-r2;
    ...
    // adjust border
    if (_island)
        {
        for (y=0;y<=mys;y+=dy2) { ter[y][0]=t; ter[y][mxs]=t; }
        for (x=0;x<=mxs;x+=dx2) { ter[0][x]=t; ter[mys][x]=t; }
        }
  }

  // Additional steps and enhancements
  ...
}
ログイン後にコピー

出力

このアプローチでは、複数の丘と現実的な海岸線を持つ、より自然に見える島が生成されます。

以上が修正されたダイヤモンド スクエア アルゴリズムを使用して現実的な島を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート