圆弧插补

圆弧插补的方法好像是比较多,在网上发现最经典的可能是DDA算法、逐点比较法、时间分割法(应该是DDA的扩展吧)。分析公司的插补算法应该是对DDA插补算法的扩展(采用弦线逼近法),具体是什么名称还不是很好确定。

关于插补算法的网站:http://www.busnc.com/ly/index.htm

下面是插补算法的分析

image

插补圆弧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);  计算各轴的移动分量

下面就是直线插补了。日志结束

  • 7
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值