首頁 >後端開發 >C++ >如何使用漸層圓形地圖產生器產生更自然的島嶼地形圖而不是圓形邊緣?

如何使用漸層圓形地圖產生器產生更自然的島嶼地形圖而不是圓形邊緣?

Susan Sarandon
Susan Sarandon原創
2025-01-07 12:16:39811瀏覽

How Can I Generate More Natural-Looking Island Terrain Maps Instead of Circular Edges Using a Gradient Circle Map Generator?

解決漸變圓形地圖產生器中圓形邊緣的問題

在地圖產生器中,您正在使用創建島嶼的方法梯度,這導致圓形邊緣。出現此問題的原因是 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn