总结
函数 main(参数)
{
// 主入口点;在这里,我们将构建我们的实体模型:
var gear = Gear(params).translate([dist,dist,0]);
参数中的牙齿数量设置为参数2中的值,即params.numTeeth = params.numTeeth2;
参数中的圆周偏航角
参数中的压力角度值将被设置为参数 pressureAngle2 的值。
参数.清关信息 = 参数.清关信息2;
参数.厚度 = 参数.厚度2;
齿轮 = 将齿轮与参数化齿轮相并集合;
返回齿轮;
}
函数 Gear(参数)
{
// 主入口点;在这里我们构建我们的实体模型:
var gear = involuteGear(
参数中的 'numTeeth' 值,
参数中的圆周偏移角
参数中的压力角值,
参数中的 'clearance' 字段,
参数中的厚度值
);
若参数中的中心孔半径大于 0 的话
{
var centerhole = CSG.cylinder({start: [0,0,-params.thickness], end: [0,0,params.thickness], radius: params.centerholeradius, resolution: 16});
齿轮 = 齿轮.减去中心孔;
}
返回齿轮;
}
// 在这里,我们定义用户可编辑的参数:
函数 getParameterDefinitions() 的代码如下:
返回 [ ]
{ name: 'numTeeth', caption: '牙齿数量:', type: 'int', default: 15 },
{ name: 'circularPitch', caption: '圆形间距:', type: 'float', default: 10 },
{ name: 'pressureAngle', caption: '压力角:', type: 'float', default: 20 },
{ name: 'clearance', caption: '清仓商品:', type: 'float', default: 0 },
{ name: 'thickness', caption: '厚度:', type: 'float', default: 5 },
{ name: 'centerholeradius', caption: '中心孔半径(无孔时为 0):', type: 'float', default: 2 },
];
}
/*
关于齿轮术语,请参见:
http://www.astronomiainumbria.org/advanced_internet_files/meccanica/easyweb.easynet.co.uk/_chrish/geardata.htm
算法基于以下基础:
http://www.cartertools.com/involute.html
圆周节距:在节圆上测量相邻齿之间的距离
*/
函数 involuteGear(齿数、圆周节距、压力角、间隙、厚度)
{
// 默认值:
若参数个数小于3,则压力角度设为20度。
若参数个数小于4,则清除间隔距离为0。
若参数个数小于4,则厚度设为1;
var addendum = 圆周率除以π;
var dedendum = addendum + clearance;
// 四个圆的半径:
var pitchRadius = 齿数圆形音箱 / (2Math.PI);
var baseRadius = pitchRadius数学函数中的 cos() 函数,其参数是π,因此可以写成 Math.cos压力角 / 180);
var outerRadius = 音高半径 + 附加值;
var rootRadius = pitchRadius - dedendum;
外半径小于等于内半径时,最大轮胎长度为外半径的平方根。外半径 - 基准半径半径 = 圆形的半径;
var maxangle = 最大切线长度 / 基准半径;
变量tl_at_pitchcircle的值等于音高半径的平方根。音高半径 - 基准半径半径 = 圆形的半径;
pitchCircle处的角度值为:angle_at_pitchcircle = tl_at_pitchcircle / baseRadius;
var diffangle = 俯仰圆上的角度 - 数学函数 Math.atan 计算出的俯仰圆上的角度值;
var angularToothWidthAtBase = Math.PI / numTeeth + 2*diffangle;
// 在 'points' 数组中构建一个单独的二维牙齿模型:
var resolution = 5;
var points = [新 CSG.Vector2D(0,0)];
for(var i = 0; i <= resolution; i++)
{
// 牙齿的第一面:
var angle = maxangle分辨率;
变量 tanlength 的值等于角度值 angle 。基准半径;
var radvector = CSG.Vector2D.fromAngle(angle);
var tanvector = radvector.normal();
var p = radvector.times(baseRadius).plus(tanvector.times(tanlength));
points[i+1] = p;
』
// 创建多边形并将其挤压成三维模型:
var tooth3d = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});
var allteeth = new CSG();
for(var i = 0; i < numTeeth; i++)
{
var angle = i*360/numTeeth;
var rotatedtooth = tooth3d.rotateZ(angle);
allteeth = allteeth.unionForNonIntersecting(rotatedtooth);
}
// 构建根圆:
分数 = [];
var toothAngle = 2Math.PI / 牙齿数量;
牙科中心的角度为 0.5 。基部处的牙齿宽度角度值;
for(var i = 0; i < numTeeth; i++)
{
var angle = 牙齿中心角度 + i * 牙齿角度;
var p = CSG.Vector2D.fromAngle(angle).times(rootRadius);
points.push(p);
}
// 创建多边形并将其挤压成三维模型:
var rootcircle = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});
var result = rootcircle.union(allteeth);
// 以原点为中心:
//result = result.translate([0, 0, -thickness/2]);
返回结果;
}
标签
模型来源
