上一篇的逐點比較法顯然是無法畫一條有傾角的直線的。因為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,多軸聯動的概念迎刃而解。