首页 >后端开发 >C++ >如何使用改进的菱形方形算法生成真实的岛屿?

如何使用改进的菱形方形算法生成真实的岛屿?

Patricia Arquette
Patricia Arquette原创
2025-01-07 12:27:45448浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn