Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menjana Lebih Banyak Peta Rupa Bumi yang Bersifat Semula Jadi Daripada Tepi Pekeliling Menggunakan Penjana Peta Bulatan Kecerunan?

Bagaimanakah Saya Boleh Menjana Lebih Banyak Peta Rupa Bumi yang Bersifat Semula Jadi Daripada Tepi Pekeliling Menggunakan Penjana Peta Bulatan Kecerunan?

Susan Sarandon
Susan Sarandonasal
2025-01-07 12:16:39809semak imbas

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

Mengatasi Isu dengan Tepi Pekeliling dalam Penjana Peta Bulatan Gradien

Dalam penjana peta anda, anda menggunakan kaedah mencipta pulau menggunakan kecerunan, yang membawa kepada tepi bulat. Isu ini timbul kerana hingar Perlin didarab dengan kecerunan warna, mengakibatkan taburan tidak sekata.

Pendekatan Alternatif: Algoritma Berlian dan Segiempat

Seperti yang dicadangkan oleh pengulas lain , pertimbangkan untuk menggunakan algoritma Diamond dan Square sebaliknya, yang menjana lebih rupa bumi yang kelihatan semula jadi. Berikut ialah gambaran keseluruhan langkah-langkah yang terlibat:

Konfigurasikan Sifat Penjanaan

Tentukan parameter seperti ketinggian minimum dan maksimum, paras laut dan julat ketinggian untuk tumbuh-tumbuhan, pasir, kotoran , dsb.

Buat Ketinggian Rupa bumi Peta

Gunakan algoritma Diamond dan Square yang diubah suai untuk menjana peta rupa bumi dengan nilai ketinggian. Laraskan algoritma untuk mencipta rupa bumi seperti pulau dengan memulakan sudut dengan ketinggian paling rendah, mengabaikan langkah berlian pertama dan membetulkan titik sempadan kepada ketinggian minimum selepas setiap lelaran segi empat sama.

Buat Peta Permukaan

Petakan nilai ketinggian kepada ciri permukaan seperti air, salji, kotoran, pasir dan tumbuh-tumbuhan berdasarkan julat ketinggian.

Ciri Tambahan

Tambahkan ciri tambahan berdasarkan cerun, seperti batu dan tebing.

Pelaksanaan dalam C

Berikut ialah coretan kod C yang menunjukkan Diamond dan Algoritma segi empat sama untuk menjana peta ketinggian rupa bumi:

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));
}

Algoritma ini menghasilkan peta rupa bumi yang kelihatan semula jadi yang boleh digunakan sebagai asas untuk penjana pulau anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Lebih Banyak Peta Rupa Bumi yang Bersifat Semula Jadi Daripada Tepi Pekeliling Menggunakan Penjana Peta Bulatan Kecerunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn