上一篇的逐点比较法显然是无法画一条有倾角的直线的。因为X轴和Y轴永远都不同步,也就是像打台球一样,你打一个,我打一个,如果我进了球,我再接着打一个。
也就是说,如果直线为45度,也是没有办法画出来的,只能是锯齿形状。
如何实现X和Y同时动?也就是说,如果要画一条45度的线,X和Y同时动不就行了么?
比如起点为0,0,终点为5,5,如果采用逐点比较法,则需要运动10次,如果两轴同时运动,则5步就可以实现了。实现的途径如下:
初始值为0,0,然后下一步,我们每个坐标增加5,则结果为5,5,这样会溢出,也就是说,溢出来出发运动一步。溢出以后清零,下一步再加5,又溢出,继续同时运动一步。一共5步就可以实现了。
等等,当然可以设置寄存器的溢出值为5,这样的寄存器使用3位就行了,但是如果要移动到(3,7)的坐标呢?显然,我们用的寄存器则可以选用溢出值为7.
这样的话,我们要用的寄存器其实需要3个,一个是存(3,7)的初始值,一个存7这个阀值,一个则是累加器。我们可以直接省掉一个阀值的寄存器。也就是说,直接用3位的寄存器,阀值为8.
步数 | X累加 | X余数 | X是否溢出 | Y累加 | Y余数 | Y是否溢出 |
0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 3 | 0 | 0 | 7 | 0 | 0 |
2 | 6 | 0 | 0 | 14 | 6 | 1 |
3 | 9 | 1 | 1 | 13 | 5 | 1 |
4 | 4 | 0 | 0 | 12 | 4 | 1 |
5 | 7 | 0 | 0 | 11 | 3 | 1 |
6 | 10 | 2 | 1 | 10 | 2 | 1 |
7 | 5 | 0 | 0 | 9 | 1 | 1 |
8 | 8 | 0 | 1 | 8 | 0 | 1 |
也就是说,当X轴和Y轴同时溢出的时候,X和Y轴是在同步运动的。
问题来了,比如我们要运动从(0,0)运动到(2554,47)这个点,实际需要多少步?
也就是说,只要能装的下2554这个的寄存器位数就可以了,也就是说,用4096来作为累加器。移动的速度则是4096*脉冲当量的周期。实际上,这个时间比2554+47慢了很多了。
但是这样做的好处显而易见,我们不是每一个图形,都是锯齿形了。
我们可以轻松的实现直接的实际刀路如上面的图形
从而实现了多座标联动,多坐标曲线插补,在轮廓控制方面得到了广泛的应用。
再来一个例子。
上面没有用到公式,如果感兴趣可以找教材了解,原理图如下:
还有一种就是圆形的DDA插补,鉴于我好不容易才理解了数字积分法,以及提高DDA插补质量用到了更加难理解的左移规格化等技术,干货太多,我打算另起一篇。
想起李笑来的一句话:解决问题的钥匙,显然大部分时候都不是要你眼睛盯着锁头,而是要到别的地方去寻找。
显然,我一开始就打算了解什么是插补,什么是联动,在百度上苦苦搜寻,压根就没有办法了解清楚,而在不经意中,为了了解DDA,多轴联动的概念迎刃而解。