用户:
一个STUB用户_6715468查看:12 回复:15 评论:12 创建时间:2021-06-24T14:32:59
大家好,我是全能岛民(就是去年某次创作节得了最佳代码奖的那个
)
这次教大家不用三角函数造一个圆
三角函数会到初中才学(所以我不会用),有什么方法不用三角函数就造一个圆呢?
其实很简单,众所周知,圆边上的任意一个点到圆点圆心的距离是相等的,那么,我们就可以利用这个性质去造一个圆
我们需要用到一个很重要方法: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');
}
}
执行后应该是这样的:
但是这是个正方形,并不是圆
现在,我们就要加一个判断,只有即将放置方块的位置与圆心位置距离小于等于半径时,才放置方块
现在,代码是这个样子的:
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');
}
}
}
结果应该是这样的:
你还可以将半径改大一点:
如果需要反复调用,还可以把代码封装成函数
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,据说第一个交且代码正确的人会收到全能岛民的神秘礼物
下期预告:
如何制作图形化界面控制玩家属性
(希望此帖不会因为屏蔽词而影响排版)
神兽喵//实心圆柱
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
评论
屑studentfunction 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
评论