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?
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!