ホームページ >バックエンド開発 >C++ >グラデーション円マップ ジェネレーターを使用して、円形のエッジではなく、より自然に見える島の地形マップを生成するにはどうすればよいですか?

グラデーション円マップ ジェネレーターを使用して、円形のエッジではなく、より自然に見える島の地形マップを生成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-07 12:16:39807ブラウズ

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

グラデーション サークル マップ ジェネレーターの円形エッジの問題に対処する

マップ ジェネレーターでは、次を使用してアイランドを作成する方法を使用しています。円形のエッジにつながるグラデーション。この問題は、パーリン ノイズにカラー グラデーションが掛けられ、不均一な分布が生じるために発生します。

代替アプローチ: ダイヤモンド アルゴリズムとスクエア アルゴリズム

別のコメント投稿者が示唆したようにの場合は、代わりに、より自然に見える地形を生成するダイヤモンドとスクエアのアルゴリズムを使用することを検討してください。関係する手順の概要は次のとおりです。

生成プロパティを構成する

最小標高と最大標高、海抜、植生、砂、土の標高範囲などのパラメーターを定義する、など

地形の高さを作成するMap

修正されたダイヤモンドおよびスクエア アルゴリズムを使用して、高さの値を含む地形マップを生成します。最も低い標高でコーナーを初期化し、最初のひし形のステップを無視し、各正方形の反復後に境界点を最小の標高に修正することにより、アルゴリズムを調整して島のような地形を作成します。

サーフェス マップの作成

標高に基づいて、標高値を水、雪、土、砂、植生などの地表フィーチャにマッピングします

追加機能

岩や崖など、傾斜に基づいて追加の機能を追加します。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。