首頁 > 後端開發 > C++ > 如何使用改進的菱形方形演算法生成真實的島嶼?

如何使用改進的菱形方形演算法生成真實的島嶼?

Patricia Arquette
發布: 2025-01-07 12:27:45
原創
471 人瀏覽過

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

沒有圓圈的柏林噪音島

不要使用漸變圓,請考慮使用Diamond & Square 演算法並進行一些修改來創建自然的外觀地圖生成器中的島嶼。

菱形和方形演算法修改

  • 配置產生屬性:建立最大和最小海拔、海平面和植被範圍等參數。
  • 建立地形高度圖(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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板