解决渐变圆形地图生成器中圆形边缘的问题
在地图生成器中,您正在使用创建岛屿的方法梯度,这导致圆形边缘。出现此问题的原因是 Perlin 噪声乘以颜色梯度,导致分布不均匀。
替代方法:菱形和正方形算法
正如另一位评论者所建议的,请考虑使用菱形和方形算法,这会生成更自然的地形。以下是所涉及步骤的概述:
配置生成属性
定义参数,例如最小和最大海拔、海平面以及植被、沙子、泥土的海拔范围等
创建地形高度地图
采用修改后的菱形和方形算法来生成具有高度值的地形图。调整算法以创建岛状地形,方法是初始化具有最低标高的角点,忽略第一个菱形步骤,并在每次方形迭代后将边界点修正为最小标高。
创建表面地图
根据海拔将海拔值映射到水、雪、泥土、沙子和植被等地表要素
附加功能
根据坡度添加附加功能,例如岩石和悬崖。
C 语言实现
这是一个 C 代码片段,演示了用于生成地形高度的菱形和方形算法地图:
void map_random(int _xs,int _ys) { float a,b; int c,t,f; int x,y,z,xx,yy,mxs,mys,dx,dy,dx2,dy2,r,r2; int **ter=NULL,**typ=NULL; Randomize(); // align resolution to power of 2 for (mxs=1;mxs+1<_xs;mxs<<=1); if (mxs<3) mxs=3; for (mys=1;mys+1<_ys;mys<<=1); if (mys<3) mys=3; 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]; // [Terrain] // diamond & square random height map -> ter[][] dx=mxs; dx2=dx>>1; r=1<<16; // init step,half step and randomness dy=mys; dy2=dy>>1; r2=r>>1; // set corners values ter[ 0][ 0]=-r2; ter[ 0][mxs]= -r2; ter[mys][ 0]= -r2; ter[mys][mxs]= -r2; ter[dy2][dx2]= r2; for (;dx2|dy2;dx=dx2,dx2>>=1,dy=dy2,dy2>>=1) // subdivide step until full image is filled { if (!dx) dx=1; if (!dy) dy=1; // diamond (skip first one for islands) 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; // square for (y=dy2,yy=mys-dy2;y<=yy;y+=dy) for (x=dx ,xx=mxs-dx ;x<=xx;x+=dx) ter[y][x]=((ter[y][x-dx2]+ter[y][x+dx2]+ter[y-dy2][x]+ter[y+dy2][x])>>2)+Random(r)-r2; for (y=dy ,yy=mys-dy ;y<=yy;y+=dy) for (x=dx2,xx=mxs-dx2;x<=xx;x+=dx) ter[y][x]=((ter[y][x-dx2]+ter[y][x+dx2]+ter[y-dy2][x]+ter[y+dy2][x])>>2)+Random(r)-r2; for (x=dx2,xx=mxs-dx2;x<=xx;x+=dx) { y= 0; ter[y][x]=((ter[y][x-dx2]+ter[y][x+dx2]+ter[y+dy2][x])/3)+Random(r)-r2; y=mys; ter[y][x]=((ter[y][x-dx2]+ter[y][x+dx2]+ter[y-dy2][x])/3)+Random(r)-r2; } for (y=dy2,yy=mys-dy2;y<=yy;y+=dy) { x= 0; ter[y][x]=((ter[y][x+dx2]+ter[y-dy2][x]+ter[y+dy2][x])/3)+Random(r)-r2; x=mxs; ter[y][x]=((ter[y][x-dx2]+ter[y-dy2][x]+ter[y+dy2][x])/3)+Random(r)-r2; } } // rescale to <h0,h1> xx=ter[0][0]; yy=xx; for (y=0;y<mys;y++) for (x=0;x<mxs;x++) { z=ter[y][x]; if (xx>z) xx=z; if (yy<z) yy=z; } for (y=0;y<mys;y++) for (x=0;x<mxs;x++) ter[y][x]=h0+(((ter[y][x]-xx)*(h1-h0))/(yy-xx)); }
此算法会生成看起来自然的地形图,可用作岛屿生成器的基础。
以上是如何使用渐变圆形地图生成器生成更自然的岛屿地形图而不是圆形边缘?的详细内容。更多信息请关注PHP中文网其他相关文章!