用户:
KaNSF查看:7 回复:5 评论:7 创建时间:2021-08-02T14:26:57
花了我一个小时的时间(大脑还在睡眠状态)
就留下你们的回复吧!

想要画椭圆,先了解函数(不知道如何描述)——
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);
}
}
这个代码有点乱,请谅解
但是画出来——

为什么会这样呢?
请看下表:
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);
}
}
}

问一下大家,有谁能把椭圆弄实心
KaNSF实心椭圆:
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
评论