猫史档案馆


【BOX3】随机地形0.2.0

用户:查看:1 回复:5 评论:1 创建时间:2023-07-03T19:16:08


在随机地形这一方面,神岛有许多大佬已经发布了不少优秀的生成代码,这里仅仅只展示一下近期的创作成果,欢迎大家对算法优化提出建议,不喜勿喷

随机地形0.1.0:https://shequ.codemao.cn/community/546613

主要更新:水域更新,卡顿优化

console.clear()
basic=70//地基高度,自选
sealevel=65//海平面高度,自选
Math.seed=Math.random()
Math.seededRandom = function(max,min){//随机数代码,不用管它
    max=max||1;
    min=min||0

    Math.seed=(Math.seed*9301+49297)%233280;
    var rnd=Math.seed/233280.0;

    return(Math.ceil(min+rnd*(max-min)))
}
async function cylinder(vox, cx, cy, cz, radius, height,changeVox){//圆柱建造
    let xend = cx+radius
    let yend = cy+height
    let zend = cz+radius
    for(let x=cx-radius; x<=xend; x++){
    for(let z=cz-radius; z<=zend; z++){
        let dx = x-cx;
        let dz = z-cz;
        if(Math.round(Math.sqrt(dx*dx+dz*dz)) <= radius){
            for(let y=cy; y<yend; y++){
                if(!changeVox.includes(voxels.getVoxel(x,y,z))){
                    voxels.setVoxel(x,y,z,vox)
                }
            }
        }
    }}
}
noiseP1Final = new Array(128).fill([]);//模拟地图盘
noiseP1FinalTure = new Array(128).fill([]);//最终地图盘
const PI=3.1415926535
for(k=0;k<=128;k++){//初始化地图
    noiseP1FinalTure[k]=[]
}
for(k=0;k<=128;k++){
    for(b=0;b<=128;b++){
        noiseP1FinalTure[k][b]=0
    }
}

//——————————算法主体——————————
function landswanp(x,y,maxh,minh){//xy=128
    for(k=0;k<=x;k++){
        noiseP1Final[k*y]=[]//初始化地图
        for(i=0;i<=x;i++){
            a=Math.seededRandom(maxh,minh)//种子取高
            noiseP1Final[k*y][i*y]=a
        }
        for(i=0;i<x;i++){//平滑算法核心
            ava=(noiseP1Final[k*y][i*y]-noiseP1Final[k*y][(i+1)*y])/2
            if(ava>=0){
                for(j=0;j<y;j++){
                    noiseP1Final[k*y][i*y+j]=noiseP1Final[k*y][i*y]+Math.floor(Math.cos(j/y*PI)*ava)-Math.floor(Math.cos(0)*ava)
                }
            }else if(ava<0){
                for(j=0;j<y;j++){
                    noiseP1Final[k*y][i*y+j]=noiseP1Final[k*y][(i+1)*y]+Math.floor(Math.cos((y-j)/y*PI)*(-ava))-Math.floor(Math.cos(0)*(-ava))
                }
            }
        }
    }
    for(k=0;k<=128;k++){
        for(i=0;i<x;i++){
            ava=(noiseP1Final[i*y][k]-noiseP1Final[(i+1)*y][k])/2
            if(ava>=0){
                for(j=0;j<y;j++){
                    noiseP1FinalTure[i*y+j][k]+=noiseP1Final[i*y][k]+Math.round(Math.cos(j/y*PI)*ava)-Math.round(Math.cos(0)*ava)
                }
            }else if(ava<0){
                for(j=0;j<y;j++){
                    noiseP1FinalTure[i*y+j][k]+=noiseP1Final[(i+1)*y][k]+Math.round(Math.cos((y-j)/y*PI)*(-ava))-Math.round(Math.cos(0)*(-ava))
                }
            }
        }
    }
}


//地形生成
landswanp(4,32,30,-30)
landswanp(8,16,18,-18)
landswanp(16,8,5,-5)

//打印主体地形
async function mainswanp(){
    for(i=0;i<=128;i++){
        for(j=0;j<=128;j++){
            sand=Math.floor(Math.seededRandom(4,-1))
            for(h=0;h<=noiseP1FinalTure[i][j]+basic-4;h++){
                voxels.setVoxel(i,h,j,129)
            }
            for(h=noiseP1FinalTure[i][j]+basic-4;h<=noiseP1FinalTure[i][j]+basic-1;h++){
                voxels.setVoxel(i,h,j,125)
            }
            if(noiseP1FinalTure[i][j]+basic>=sealevel){
                voxels.setVoxel(i,noiseP1FinalTure[i][j]+basic,j,127)
                if(noiseP1FinalTure[i][j]+basic<=sealevel+sand){
                    voxels.setVoxel(i,noiseP1FinalTure[i][j]+basic,j,135)
                }
            }
            for(h=0;h<=sealevel;h++){
                if(voxels.getVoxelId(i,h,j)==0){
                    voxels.setVoxel(i,h,j,3喵)
                }
            }
            await sleep(1)
        }
    }
}
//代码主体
async function finalswanp(){
    CanChangeVoxClay=[0,3喵,129]
    CanChangeVoxSand=[0,3喵,129]
    await mainswanp();
    for(i=0;i<=128;i++){
        for(j=0;j<=128;j++){
            sandR=Math.floor(Math.seededRandom(7,-40))
            sandH=Math.floor(Math.seededRandom(5,2))
            clayR=Math.floor(Math.seededRandom(5,-120))
            clayH=Math.floor(Math.seededRandom(4,2))
            if(clayR>=1&&noiseP1FinalTure[i][j]+basic<=sealevel){//铺沙
                cylinder(135, i, noiseP1FinalTure[i][j]+basic-sandH, j, sandR, sandH,CanChangeVoxSand)
            }
            if(clayR>=1&&noiseP1FinalTure[i][j]+basic<=sealevel){//粘土
                cylinder(247, i, noiseP1FinalTure[i][j]+basic-clayH, j, clayR, clayH,CanChangeVoxClay)
            }
            await sleep(1/10)
        }
    }
}

finalswanp();

效果如下:

center_image

 

center_image

有需欢迎大家取用


回复

上一页1 页 / 共 1下一页

重投了,函数有两个字符打反了

emotion_编程猫_搓头

点赞0


评论


苏联的达瓦里希球苏联的达瓦里希球

正在观赏地图的大好河山……center_image

呵呵!代码生成的emotion_挤眼

感谢开源!效果如上!

真的好用!(提示:这是arena)

emotion_编程猫_厉害了emotion_编程猫_厉害了emotion_编程猫_厉害了emotion_编程猫_厉害了

点赞0


评论


神奇代码岛func王清林神奇代码岛func王清林

hotdog

点赞0


评论


SCS_user_rbxaHQh5aOSCS_user_rbxaHQh5aO

但是湖底好丑

点赞0


评论


【MC●绝人】编程猫【MC●绝人】编程猫

自己用world machine搓一个()

点赞1


评论