猫史档案馆


岛三画椭圆

用户:KaNSFKaNSF查看:7 回复:5 评论:7 创建时间:2021-08-02T14:26:57


花了我一个小时的时间(大脑还在睡眠状态)

就留下你们的回复吧! 

emotion_编程猫_溜了溜了

想要画椭圆,先了解函数(不知道如何描述)——

x2/a2+y2/b2=1

(x+k)2/a2+(y+l)2/b2=1

有的计算器能画出来一个椭圆,不信你试试......

现在我们思考一下——

我们画的是一个横着的(求原谅,我语文不好)椭圆,

我们需要通过x坐标确定z坐标

现在就先定义几个量:

const cx = 19;/*中心点x*/
const cz = 36;/*中心点z*/
const y = 44;/*y坐标*/
const vox = 'white';/*方块*/
const rx = 9;/*x轴上的半径*/
const rz = 14;/*z轴上的半径*/

然后结合一下....

for (let x = -cx; x <= rx - cx; x++) {
    var z = cz + Math.round(Math.sqrt(1 - (x + cx) * (x + cx) / (rx * rx)) * rz);
    voxels.setVoxel(Math.abs(x), y, Math.abs(z), vox);
}

结果能画出来1/4个椭圆

因为——

而且我有点懒......

所以——

for (let x = -cx; x <= rx - cx; x++) {
    for (let i = -1; i <= 1; i += 2) {
        var z = cz + i * Math.round(Math.sqrt(1 - (x + cx) * (x + cx) / (rx * rx)) * rz);
        voxels.setVoxel(Math.abs(x), y, Math.abs(z), vox);
        voxels.setVoxel(-Math.abs(x)+2*cx, y, Math.abs(z), vox);
    }
}

这个代码有点乱,请谅解

但是画出来——

center_image

为什么会这样呢?

请看下表:

Math.abs(x) 10    11      12       13      14       15       16       17       18

Math.abs(z) 36 42&30 45&27 46&26 48&24 49&23 49&23 50&22 50&22

找到原因了——x分的不够细

那就分细!

for (let x = -cx; x <= rx - cx; x+=0.02) {
    for (let i = -1; i <= 1; i += 2) {
        var z = cz + i * Math.round(Math.sqrt(1 - (x + cx) * (x + cx) / (rx * rx)) * rz);
        voxels.setVoxel(Math.abs(Math.round(x)), y, Math.abs(z), vox);
        voxels.setVoxel(-Math.abs(Math.round(x))+2*cx, y, Math.abs(z), vox);
    }
}

瞬间流畅......

全部代码:

const cx = 19;/*中心点x*/
const cz = 36;/*中心点z*/
const y = 44;/*y坐标*/
const vox = 'white';/*方块*/
const rx = 9;/*x轴上的半径*/
const rz = 14;/*z轴上的半径*/
for (let x = -cx; x <= rx - cx; x+=0.02) {
    for (let i = -1; i <= 1; i += 2) {/*有了这个能画半个椭圆*/
        var z = cz + i * Math.round(Math.sqrt(1 - (x + cx) * (x + cx) / (rx * rx)) * rz);
        voxels.setVoxel(Math.abs(Math.round(x)), y, Math.abs(z), vox);
        voxels.setVoxel(-Math.abs(Math.round(x))+2*cx, y, Math.abs(z),vox);/*最后半个椭圆*/
    }
}

封装成函数:

function ellipse(cx, cz, y, vox, rx, rz) {
    for (let x = -cx; x <= rx - cx; x += 0.02) {
        for (let i = -1; i <= 1; i += 2) {
            var z = cz + i * Math.round(Math.sqrt(1 - (x + cx) * (x + cx) / (rx * rx)) * rz);
            voxels.setVoxel(Math.abs(Math.round(x)), y, Math.abs(z), vox);
            voxels.setVoxel(-Math.abs(Math.round(x)) + 2 * cx, y, Math.abs(z), vox);
        }
    }
}

 

emotion_编程猫_点赞

问一下大家,有谁能把椭圆弄实心


回复

上一页1 页 / 共 1下一页
KaNSFKaNSF

ddddddddddd

点赞0


评论


KaNSFKaNSF

喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵

点赞0


评论


YDS尹子YDS尹子

加油!

过一年后你就会变成我了

(去年这时候我也在干这事)

点赞0


评论


KaNSFKaNSF

)))))))))))))

点赞0


评论


KaNSFKaNSF

实心椭圆:

function ellipse(cx, cz, y, vox, rx, rz) {
    for (let x = -cx; x <= rx - cx; x += 0.02) {
        for (let i = -1; i <= 1; i += 2) {
            var z = cz + i * Math.round(Math.sqrt(1 - (x + cx) * (x + cx) / (rx * rx)) * rz);
            voxels.setVoxel(Math.abs(Math.round(x)), y, Math.abs(z), vox);
            voxels.setVoxel(-Math.abs(Math.round(x)) + 2 * cx, y, Math.abs(z), vox);
        }
    };
    if (rx <= 0 || rz <= 0) {
        return;
    } else {
        ellipse(cx, cz, y, vox, rx - 1, rz - 1);
    };
};

 

点赞0


评论