猫史档案馆


【可白嫖】地形生成-石头山(valuenoise算法)

用户:小苏打_小苏打_查看:36 回复:17 评论:36 创建时间:2022-07-10T10:49:01


/*VALUENOISE */
async function valuenoise(p1, p2, p3, p4, nv1, nv2, nv3, nv4, func){
    /**
     *  y
     *  ↑
     *  | (0,2) p3    (2,2) p4
     *  | (0,1) (1,1) (2,1) (3,1)
     *  | (0,0) p1    (2,0) p2
     *  +------------------------->x
     *  默认为矩形
     * 
     * eg:
     * p1(1,0) 
     * p2(3,0)
     * p3(1,2)
     * p4(3,2)
    */

    if(nv1 === void 0){
        nv1 = Math.floor(Math.random()*60)+1;
    }
    if(nv2 === void 0){
        nv2 = Math.floor(Math.random()*60)+1;
    }
    if(nv3 === void 0){
        nv3 = Math.floor(Math.random()*60)+1;
    }
    if(nv4 === void 0){
        nv4 = Math.floor(Math.random()*60)+1;
    }
    if(func === void 0){
        func = x => 6*x**5 - 15*x**4 + 10*x**3;
    }

    let p1x = p1.z;
    let p2x = p2.z;
    let p3x = p3.z;
    let p4x = p4.z;

    let p1y = p1.x;
    let p2y = p2.x;
    let p3y = p3.x;
    let p4y = p4.x;

    for(let x=p1.z;x<=p2.z;x++){
        for(let y=p1.x;y<=p3.x;y++){
            // if((x==p1.z || x==p2.z || x==p3.z || x==p4.z) && (y==p1.x || y==p2.x || y==p3.x || y==p4.x)){
            //     continue;
            // }

            let n1 = (func((x-p1x)/(p2x-p1x))*nv1 + func((p2x-x)/(p2x-p1x))*nv2);
            let n2 = (func((x-p3x)/(p4x-p3x))*nv3 + func((p4x-x)/(p4x-p3x))*nv4);

            let res = (func((y-p1y)/(p3y-p1y))*n1 + func((p3y-y)/(p3y-p1y))*n2);

            await sleep(1);

            for(let z=8;z<=res;z++){
                voxels.setVoxel(y,z,x,'stone');
            }
        }
    }
}

function gethight(x,z){
    for(let y=0;y<=喵;y++){
        if(voxels.getVoxelId(x,y,z)!=235){
            return y-1;
        }
    }
    return 114514;
}


!(async function(){
    for(let x=0;x<=256;x+=16){
        for(let z=0;z<=256;z+=16){
            for(let y=0;y<=Math.round(Math.random()*32)+32;y++){
                voxels.setVoxel(x,y,z,'carpet_08');
                voxels.setVoxel(x-1,y,z,'carpet_08');
                voxels.setVoxel(x,y,z-1,'carpet_08');
                voxels.setVoxel(x-1,y,z-1,'carpet_08');
            }
        }
    }
    for(let x=0;x<=256;x+=16){
        for(let z=0;z<=256;z+=16){
            valuenoise(
                new Box3Vector3(x,0,z), 
                new Box3Vector3(x,0,z+15),
                new Box3Vector3(x+15,0,z), 
                new Box3Vector3(x+15,0,z+15),
                gethight(x+15,z+15),
                gethight(x+15,z),
                gethight(x,z+15),
                gethight(x,z),
            )
            await sleep(100)
        }
    }
})()


回复

上一页1 页 / 共 1下一页
敲阔耐的小企鹅敲阔耐的小企鹅

有bug?

点赞0


评论


电电小玩电电小玩

真不戳

点赞0


评论


星星上的雪花星星上的雪花

这 gethight 函数也太臭了吧(恼)

点赞1


评论


小苏打_小苏打_

紧急修复bug(控制台可用)

/*VALUENOISE */
async function valuenoise(p1, p2, p3, p4, nv1, nv2, nv3, nv4, func){
    /**
     *  y
     *  ↑
     *  | (0,2) p3    (2,2) p4
     *  | (0,1) (1,1) (2,1) (3,1)
     *  | (0,0) p1    (2,0) p2
     *  +------------------------->x
     *  默认为矩形
     * 
     * eg:
     * p1(1,0) 
     * p2(3,0)
     * p3(1,2)
     * p4(3,2)
    */

    if(nv1 === void 0){
        nv1 = Math.floor(Math.random()*60)+1;
    }
    if(nv2 === void 0){
        nv2 = Math.floor(Math.random()*60)+1;
    }
    if(nv3 === void 0){
        nv3 = Math.floor(Math.random()*60)+1;
    }
    if(nv4 === void 0){
        nv4 = Math.floor(Math.random()*60)+1;
    }
    if(func === void 0){
        func = x => 6*x**5 - 15*x**4 + 10*x**3;
    }

    let p1x = p1.z;
    let p2x = p2.z;
    let p3x = p3.z;
    let p4x = p4.z;

    let p1y = p1.x;
    let p2y = p2.x;
    let p3y = p3.x;
    let p4y = p4.x;

    for(let x=p1.z;x<=p2.z;x++){
        for(let y=p1.x;y<=p3.x;y++){
            let n1 = (func((x-p1x)/(p2x-p1x))*nv1 + func((p2x-x)/(p2x-p1x))*nv2);
            let n2 = (func((x-p3x)/(p4x-p3x))*nv3 + func((p4x-x)/(p4x-p3x))*nv4);

            let res = (func((y-p1y)/(p3y-p1y))*n1 + func((p3y-y)/(p3y-p1y))*n2);

            await sleep(1);

            for(let z=8;z<=res;z++){
                voxels.setVoxel(y,z,x,'stone');
            }
        }
    }
}

function gethight(x,z){
    for(let y=0;y<=喵;y++){
        if(voxels.getVoxelId(x,y,z)!=235){
            return y-1;
        }
    }
    return 114514;
}


!(async function(){
    for(let x=0;x<=256;x+=16){
        for(let z=0;z<=256;z+=16){
            for(let y=0;y<=Math.round(Math.random()*32)+16;y++){
                voxels.setVoxel(x,y,z,'carpet_08');
                voxels.setVoxel(x-1,y,z,'carpet_08');
                voxels.setVoxel(x,y,z-1,'carpet_08');
                voxels.setVoxel(x-1,y,z-1,'carpet_08');
            }
        }
    }
    for(let x=0;x<=256;x+=16){
        for(let z=0;z<=256;z+=16){
            valuenoise(
                new Box3Vector3(x,0,z), 
                new Box3Vector3(x,0,z+15),
                new Box3Vector3(x+15,0,z), 
                new Box3Vector3(x+15,0,z+15),
                gethight(x+15,z+15),
                gethight(x+15,z),
                gethight(x,z+15),
                gethight(x,z),
            );
            await sleep(100);
        }
    }
})();

外加效果演示

center_image

点赞1


评论


小苏打_小苏打_

虽然可以白嫖,但是留下你们免费的评论不过分吧()

如果代码有什么地方不妥也请大佬帮忙指出()

点赞0


评论


yee089yee089

我怎么记得valuenoise是perlinnoise--版(?)

点赞0


评论


无畏的训练师FooH无畏的训练师FooH

这么多的代码,我看晕了!

点赞0


评论


Robot一只屑代码师Robot一只屑代码师

center_image

点赞0


评论


如风gvk如风gvk

额)

点赞0


评论


某豪MH某豪MH

怎么修改范围啊

点赞0


评论


指令者指令者

666666666666666666666666666666666666

点赞0


评论


指令者指令者

夹吃灰()

点赞0


评论


用户_869149用户_869149

这返回值也太臭了吧(恼

点赞0


评论


麦尼昂高年櫜麦尼昂高年櫜

怎么让他保存,就是关闭后还可以显示,求求,在线等,把代码发一下

 

点赞0


评论


OzerOzer

再挖

点赞0


评论


145a145a

nb

点赞0


评论


岛三的赜黎岛三的赜黎

???????center_image然后.......没了?

点赞0


评论