圆弧插补的方法好像是比较多,在网上发现最经典的可能是DDA算法、逐点比较法、时间分割法(应该是DDA的扩展吧)。分析公司的插补算法应该是对DDA插补算法的扩展(采用弦线逼近法),具体是什么名称还不是很好确定。
关于插补算法的网站:http://www.busnc.com/ly/index.htm
下面是插补算法的分析
插补圆弧AC,可以采用弦高很小的弦线代替圆弧。如上图所示
OD=R-ED (ED弦高,已知值)
AB = SQR(R*R – OD*OD)
认为直线AB的长度等于圆弧AB的弧长,由弧长公式:弧长=弧长对应的圆心角*半径
可以计算出圆心角(OA与OB的夹角),A点坐标为已知,所以可以计算出B点坐标,后面就是直线插补了,使用AB线段代替AB弧。
下面是程序分析
double x0,y0,arci,arcj,xe,ye; // x0,y0圆弧起点坐标,xe,ye圆弧终点坐标,arci,arcj圆心对应圆弧起点的增量坐标
line_angle(x0+arci,y0+arcj,x0,y0,&start_angle,&deltax0,&deltay0); 计算圆弧起点与X轴的夹角
r0=sqrt(deltax0*deltax0+deltay0*deltay0); 计算圆弧半径
line_angle(x0+arci,y0+arcj,xe,ye,&end_angle,&deltaxe,&deltaye); 计算圆弧终点坐标与X轴的夹角
if (type==2)
total_angle=start_angle-end_angle;
else
total_angle=end_angle-start_angle; 计算整段弧所对应的圆心角
if (total_angle<0) total_angle+=6.283185308;/* 2*PI */
delta_angle=2*sqrt(2*bow_height*r0-bow_height*bow_height)/r0; 计算最大弦线对应的圆心角,其中bow_height=1
da0+=delta_angle; 计算本次插补的圆心角,注意是与圆弧起点构成的圆心角
if ((total_angle-da0+0.000001)
if (mvtype==2) alfa=start_angle-da0;
else alfa=start_angle+da0;
lxe=ix0+iarci+r0*cos(alfa);
lye=iy0+iarcj+r0*sin(alfa); 计算本次插补的终点坐标
adelta1=dround(lxe)-dround(lx0);
adelta2=dround(lye)-dround(ly0); 计算各轴的移动分量
下面就是直线插补了。日志结束