多面体函数:polyhedron,其中:points 是顶点,而 triangles 是顶点所围成的三角形。多面体就是不停的贴三角形而成的!这也是计算机处理立体几何的基本算法!
参考下面的代码,下面是一个三角体,有6个顶点,5个面,其中矩形的面由2个三角面组成,最后triangles 里就有8个三角面的数组;
function main(){
var x=10; //长
var y=10; //宽
var h=2; //高
return polyhedron({ // openscad-like (e.g. pyramid)
points: [ [0,0,0],[0,0,h],[x,0,h],[x,0,0], // the four points at base
[0,y,0],[0,y,h] ], // the apex point
triangles: [ [0,1,2],[0,2,3],
[1,5,2],
[0,3,4],
[1,0,4],[1,4,5],
[3,2,5],[5,4,3]// each triangle side
]
});
}
一般多面体极其难以理解,需要通过函数的方式封装成通用函数才好调用。
例如:
//多面体测试
function getParameterDefinitions () {
return ([
{name: 'x', type: 'float', initial: 40, step: 0.5, caption: '底板长'},
{name: 'y', type: 'float', initial: 40, step:0.5, caption: '上板长'},
{name: 'h', type: 'float', initial: 3, step: 0.1, caption: '厚度'},
{name: 'z', type: 'float', initial: 40, step: 0.5, caption: '三角件长'},
{name: 'a', type: 'float', initial: 40, step: 0.5, caption: '长度'}
//{name: 'z', type: 'choice',caption:'是否空心', initial:0, values: [0, 1], captions:['否','是']}
]);
}
function main(parameters){
//return sjx(20,20,2);
return zhijia(parameters.x,parameters.y,parameters.h,parameters.z,parameters.a).translate([-parameters.x/2,-parameters.a/2,0]);
}
//x:长;y:宽: h: 厚, z:角件的长度;m:宽度
function zhijia(x,y,h,z,m=10){
var c=z; //角件长度
//var r=[];
var a=cube([x,m,h]);
var b=cube([h,m,y]);
var c1=sjx(c,c,h).rotateX(90).translate([0,h,0]);
var c2=sjx(c,c,h).rotateX(90).translate([0,m,0]);
var r=union(a,b,c1,c2);
return r;
}
/*
用多面体重画三角体
x: 长;单位:mm
y: 宽; 单位:mm
h: 厚; 单位: mm
*/
function sjx(x,y,h){
//一共是:6个定点,5个面,8个三角形面
//计算需要用右手螺旋法则,即大拇指指向后,采取逆时针方向旋转才可以准确的求出多面体
return polyhedron({ // openscad-like (e.g. pyramid)
points: [ [0,0,0],[0,0,h],[x,0,h],[x,0,0], // the four points at base
[0,y,0],[0,y,h] ], // the apex point
triangles: [ [0,1,2],[0,2,3],
[1,5,2],
[0,3,4],
[1,0,4],[1,4,5],
[3,2,5],[5,4,3]// each triangle side
]
});
}
上面的代码核心就是用三角体组成的各种复杂图形,而三角体已经封装成了函数!
一个简单的多面体模型:
var a=polyhedron({
points:[[0,0,0],[50,0,0],[0,50,0],[0,0,50]],
//triangles:[[0,1,2],[1,0,3],[2,1,3],[0,2,3]]
triangles:[[0,1,2],[3,1,0],[2,1,3],[0,2,3]]
});
return a;
注意上面的注释掉的triangles ,2个都是对的,看第2个面为什么 [1,0,3]和[3,1,0]都可以,但[0,1,3]就不行了?因为多面体需要从外面包围成闭合面,也就是从外面往里面看,需要是顺时针成面,而如果逆时针成面的话,从反方向就可以看到面。仔细体会。
|