>백엔드 개발 >C++ >Gradient Circle Map Generator를 사용하여 원형 가장자리 대신 더욱 자연스럽게 보이는 섬 지형 지도를 생성하려면 어떻게 해야 합니까?

Gradient Circle Map Generator를 사용하여 원형 가장자리 대신 더욱 자연스럽게 보이는 섬 지형 지도를 생성하려면 어떻게 해야 합니까?

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?

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

이 알고리즘은 섬 생성기의 기초로 사용할 수 있는 자연스러운 지형 지도를 생성합니다.

위 내용은 Gradient Circle Map Generator를 사용하여 원형 가장자리 대신 더욱 자연스럽게 보이는 섬 지형 지도를 생성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.