猫史档案馆


【教程】如何不用三角函数造一个圆

用户:一个STUB用户_6715468一个STUB用户_6715468查看:12 回复:15 评论:12 创建时间:2021-06-24T14:32:59


大家好,我是全能岛民(就是去年某次创作节得了最佳代码奖的那个emotion_doge

这次教大家不用三角函数造一个圆

三角函数会到初中才学(所以我不会用),有什么方法不用三角函数就造一个圆呢?

其实很简单,众所周知,圆边上的任意一个点到圆点圆心的距离是相等的,那么,我们就可以利用这个性质去造一个圆

我们需要用到一个很重要方法:distance,这个方法的用处是返回两个坐标点的直线距离

举个例子:

new Box3Vector3(喵,9,喵).distance(Box3Vector3(喵,9,70))//6

这个方法非常简单,接下来就用这个方法造一个圆(不是球)

首先,我们先写好一个初步的框架:

var radius = 5;
var position = new Box3Vector3(45, 9, 23);
for (let x = position.x - radius; x <= position.x + radius; x++) {
    for (let z = position.z - radius; z <= position.z + radius; z++) {
        voxels.setVoxel(x, position.y, z, 'stone');
    }
}

执行后应该是这样的:center_image

但是这是个正方形,并不是圆

现在,我们就要加一个判断,只有即将放置方块的位置与圆心位置距离小于等于半径时,才放置方块

现在,代码是这个样子的:

var radius = 5;
var position = new Box3Vector3(45, 9, 23);
for (let x = position.x - radius; x <= position.x + radius; x++) {
    for (let z = position.z - radius; z <= position.z + radius; z++) {
        if(new Box3Vector3(x,position.y,z).distance(position) <= radius){
            voxels.setVoxel(x, position.y, z, 'stone');
        }
    }
}

结果应该是这样的:center_image

你还可以将半径改大一点:center_image

如果需要反复调用,还可以把代码封装成函数

function circle(radius, position, voxel) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let z = position.z - radius; z <= position.z + radius; z++) {
            if (new Box3Vector3(x, position.y, z).distance(position) <= radius){
                voxels.setVoxel(x, position.y, z, voxel);
            }
        }
    }
}
//调用:
circle(5,new Box3Vector3(45, 9, 23),'stone');

改改代码,生成一个球:

function circle(radius, position, voxel) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let y = position.y - radius; y <= position.y + radius; y++) {
            for (let z = position.z - radius; z <= position.z + radius; z++) {
                    if (new Box3Vector3(x, y, z).distance(position) <= radius){
                        voxels.setVoxel(x, y, z, voxel);
                    }
                }
        }
    }
}
//调用:
circle(5,new Box3Vector3(45, 14, 23),'stone');

或者一个圆柱:

function circle(radius, position, voxel) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let y = position.y; y <= position.y + radius; y++) {
            for (let z = position.z - radius; z <= position.z + radius; z++) {
                    if (new Box3Vector3(x, position.y, z).distance(position) <= radius){
                        voxels.setVoxel(x, y, z, voxel);
                    }
                }
        }
    }
}
//调用:
circle(5,new Box3Vector3(45, 9, 23),'stone');

这里留个作业:

修改代码,如何生成一个空心圆/空心球/空心圆柱呢?

作业3选1,据说第一个交且代码正确的人会收到全能岛民的神秘礼物

下期预告:

如何制作图形化界面控制玩家属性

 

(希望此帖不会因为屏蔽词而影响排版)


回复

上一页1 页 / 共 1下一页
一个STUB用户_6715468一个STUB用户_6715468

太好了,没影响排版!

点赞0


评论


一个STUB用户_6715468一个STUB用户_6715468

提示:如果要敲到控制台里面时请将注释删除

点赞1


评论


神兽喵神兽喵

//实心圆柱
var radius = 5;
var hight = 10;
var position = new Box3Vector3(45, 9, 23);
for (let y = position.y; y <= position.y+10; y++) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let z = position.z - radius; z <= position.z + radius; z++) {
            if(new Box3Vector3(x,position.y,z).distance(position) <= radius){
                voxels.setVoxel(x, y, z, 'stone');
            }
        }
    }
}
//空心圆柱
var radius = 5;
var hight = 10;
var position = new Box3Vector3(45, 9, 23);
for (let y = position.y; y <= position.y+hight; y++) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let z = position.z - radius; z <= position.z + radius; z++) {
            if(new Box3Vector3(x,position.y,z).distance(position) <= radius){
                voxels.setVoxel(x, y, z, 'stone');
            }
        }
    }
}
radius -= 1
for (let y = position.y+1; y <= position.y+hight-1; y++) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let z = position.z - radius; z <= position.z + radius; z++) {
            if(new Box3Vector3(x,position.y,z).distance(position) <= radius){
                voxels.setVoxel(x, y, z, 'air');
            }
        }
    }
}

点赞0


评论


屑student屑student

function circle(radius, position, voxel) {
    for (let x = position.x - radius; x <= position.x + radius; x++) {
        for (let y = position.y; y <= position.y + radius; y++) {
            for (let z = position.z - radius; z <= position.z + radius; z++) {
                    if (Math.round(new Box3Vector3(x, position.y, z).distance(position)) == radius){
                        voxels.setVoxel(x, y, z, voxel);
                    }
                }
        }
    }
}
//调用:
circle(5,new Box3Vector3(90, 20, 23),'stone');

点赞0


评论


芜湖咸鱼芜湖咸鱼

我寻思着你也没有用三角函数啊

点赞1


评论


梦里觅深海梦里觅深海

额,这不是很规整

点赞0


评论


梦里觅深海梦里觅深海

可以加个round四舍五入下

点赞0


评论


研岩研岩

这玩意好像还可以

点赞0


评论


全能代码师全能代码师

我咋觉得和api有亿点像呢

点赞1


评论


神岛吉吉喵神岛吉吉喵

emotion_编程猫_点赞

点赞1


评论


BSS梅者如西BSS梅者如西

https://shequ.codemao.cn/community/320119

点赞0


评论


不练兔兔的屑博士不练兔兔的屑博士

(瞎猜)

空心可能是

在里面(同中心)造一个半径为(原来的半径-1)的圆柱/圆/球体

点赞0


评论


一个STUB用户_6923702一个STUB用户_6923702

是Shyfc的方法把

点赞0


评论


YDS尹子YDS尹子

交作业:

https://shequ.codemao.cn/community/330345

点赞0


评论


YDS尹子YDS尹子

有邮箱吗加一个喵)  

点赞0


评论