另外,xy感觉没必要用float数组,直接float x1,x2,y1,y2即可。反正你每次2个端点都是算出来的,用了一次就不用了,存不存的没必要。
1、程序流程图分析与改写因为参考程序流程图中存在两个if分支交叉的情况,这种程序流程无法直接用循环结构实现,所以需要对程序流程图进行改写。
在改写之前需要对整个流程图进行分析。
参考流程图可以分成两部分,如上图所示,第一部分是红色框部分,对应理论计算中的从动件运动规律部分;第二部分是黄色框部分,对应各种直角坐标计算以及刀具中心轨迹的计算。
根据流程图可知,通过让运动角φ在[0,2pi]区间内变化,可以根据理论计算出相应的凸轮轮廓曲线坐标以及运动轨迹,所以可以用φ作为循环条件,每循环一次让φ值加1即可。
但由于存在许用压力角,当实际演算出来的压力角大于许用压力角的时候,需要增大基圆半径r0,并对φ值清零重新演算。所以要在循环结构当中增加相应的条件判断分支,以便实现此功能。
调整之后的程序流程图如下所示:
2、计算过程的实现2.1 从动件运动规律
if (phi<=Phi){
// 计算推程s
s = h * ( phi/Phi - 1/(2*PI) * sin(2*PI/Phi)*phi)
ds= h/Phi*(1-cos(2*PI/Phi)*phi)
}
else
{
if (phi<=(Phi+PhiS))
{
s=h
ds=0
}
else
{
if (phi<=(Phi+PhiS+dPhi))
{
// 计算回程s
s = h * ( 1 - (phi-Phi-PhiS)/dPhi + 1/(2*PI)*sin(2*PI/dPhi)*(phi-Phi-PhiS) )
ds= h * ( 1- 1/dPhi + 1/(dPhi) * cos(2*PI/dPhi) * (phi - Phi -dPhiS))
}
else
{
s=0
ds=0
}
}
}
2.2 理论轮廓直角坐标
// 计算理论轮廓直角坐标x,ys0=sqrt(pow(r0,2)+pow(e,2))
x=(s0+s)*cos(phi) - e*sin(phi)
y=(s0+s)*sin(phi) - e*cos(phi)
2.3 实际轮廓直角坐标
dx = -(s0+s)*sin(phi)-e*cos(phi)dy = (s0+s)*cos(phi) - e*sin(phi)
// 计算实际轮廓直角坐标X,Y
X = x - rT * dy/(sqrt(pow(dx,2)+pow(dy,2)))
Y = y + rT * dx/(sqrt(pow(dx,2)+pow(dy,2)))
2.4 刀具中心轨迹
2.5 压力角
// 计算压力角a,找出最大值amaxa = atan(abs(ds-e)/(s+s0)) 3、总程序 4、输出样例
部分输出样例如下所示:
moose@debian:~/p_project/2015xxxx_百度知道/c_cam$ ./a.outr0=45.000000, phi=0.000000, s=0.000000, ds=0.375000, a=0.151973, amax=0.151973, x=45.705578, y=-8.000000, X=36.347839, Y=-9.637916, xc=0.000000, yc=0.000000
r0=45.000000, phi=1.000000, s=0.000171, ds=0.000514, a=0.151973, amax=0.151973, x=17.963154, y=34.137642, X=14.285400, Y=25.378410, xc=0.000000, yc=0.000000
...
r0=45.000000, phi=119.000000, s=0.020388, ds=-44.188843, a=0.849510, amax=0.849510, x=45.426483, y=-24.410582, X=36.129913, Y=-22.455133, xc=0.000000, yc=0.000000
r0=45.000000, phi=120.000000, s=0.020559, ds=-44.563328, a=0.849509, amax=0.849510, x=32.584461, y=20.035658, X=25.916046, Y=13.269401, xc=0.000000, yc=0.000000
r0=45.000000, phi=121.000000, s=45.000000, ds=0.000000, a=0.087970, amax=0.849510, x=-12.404583, y=90.987427, X=-11.110419, Y=81.575989, xc=0.000000, yc=0.000000
...
r0=45.000000, phi=180.000000, s=45.000000, ds=0.000000, a=0.087970, amax=0.849510, x=-47.874447, y=-67.881332, X=-42.879730, Y=-59.800316, xc=0.000000, yc=0.000000
r0=45.000000, phi=181.000000, s=44.999592, ds=30.035320, a=0.237949, amax=0.849510, x=39.310745, y=-87.747360, X=35.209457, Y=-79.178261, xc=0.000000, yc=0.000000
r0=45.000000, phi=182.000000, s=44.999187, ds=30.534101, a=0.237950, amax=0.849510, x=90.353180, y=-26.939114, X=80.926598, Y=-25.760328, xc=0.000000, yc=0.000000
...
r0=45.000000, phi=360.000000, s=0.000000, ds=0.000000, a=0.173278, amax=0.849510, x=-20.637590, y=46.097324, X=-16.412260, Y=37.588707, xc=0.000000, yc=0.000000