[原创] GUI原理2 - 矢量线条
| [原創] GUI原理2 - 矢量線條 |
| |
| □ 作者:evolrof?? 2004-11-21 13:11:01? |
| ??? 先來說說畫線,畫線要從直線說起。直線嘛,我想大家都會覺得簡單,不就是一條線嘛。不過,簡單的線條要用計算機的語言去實現,也是有些復雜的。線條有兩種分類——鋸齒線和平滑線。 ??? 鋸齒線最為簡單,直接使用int類型就可以完成所有的重繪工作。int??這里所說的int是整數類型,為的是要區別后面講的Fixed類型。一般,我們認為一條直線就是從起點到終點的連接線,不過,要受到圖形顯示的最小單位——點——的限制,所以線條呈現齒條狀。我們還需要知道線的斜率或者角度,這個可以通過X和Y軸的偏移量來測得。一般來說,通過反正切函數,可以得到角度值,但我們不需要這么麻煩。通過ABS,就是取某個數的絕對值函數,可以得到以下公式ABS(X2-X1),再與ABS(Y2-Y1)進行比較,看誰的偏移量大。通常,我們還需要考慮到偏移量為0的情況。一般說來,水平和垂直的直線最好畫,而有著傾斜角度的直線難畫些。我這里就把畫傾斜直線的方法稱之為“步進法”,除了水平和垂直直線外,都使用這種方法,且選擇一銎屏孔畬蟮鬧帷?lt;/P> ??? 如下的圖,X軸的偏移量較大。具體的方法是,X軸每偏移一次,即一個點的單位,Y軸偏移不到一個點的單位,并且四舍五入。確定好坐標后,將顏色畫到屏幕上,就得到如下的線條。 ??? 舉例,從(0,0)到(100,40)畫線,則X軸偏移量為100,Y軸偏移量為40。以X軸為主方向,每次移動1個像素,則Y軸每次移動0.4個像素。因為要受到屏幕最小單位點的影響,Y軸每次偏移后要進行四舍五入。比如在X軸方向的第8個點,也就是X=8時,則Y=3.2,四舍五入后為3。則我們在(8,3)的位置畫上一個點。 ??? 畫線并不是這么簡單的,要考慮到多方因素,比如速度問題。一般來說,好的程序員都不會使用浮點類型,也就是小數。因為浮點在所有計算中都會比整數來的慢,而且在嵌入式CPU上整數的除法就是浮點的乘法,實際上就是除數的倒數用來做剩發而已。因此,我們必須引入一種新的數據類型,來加速所有的運算。 ??? Fixed是業界使用最廣的一種類型,他并沒有在標準C或者其他語言中定義,程序員可以靈活的使用Fixed類型,可以定義自己想要的Fixed類型。那么什么是Fixed類型呢?Fixed類型是用來取代浮點,使用4字節的高2個字節表示整數位,低2個字節表示浮點位。每個字節有8個bit位,4個字節32個bit位,因此,我們把這種Fixed稱為16.16Fixed。當然,也有使用24.8的Fixed,這就要看需求和精確度了。比如Fixed中的數字1,就是65536,也就是(1<<16)。這里用了位移公式,就是將1左移16位,也就是2個字節,左移16等于剩以65536,只不過位移來的非常快,快過加法。(這里理解不了就算了)比如數字32.5,等于(32<<16)|32768,等于32*65536+32768。為什么要這么麻煩呢?有了Fixed,就好像操作整數一樣,都是整數運算了。Fixed的四舍五入也很簡單,比如我們將X四舍五入到整數類型,就是(X+32768)>>16。32768就是半個Fixed的1,也就是浮點的0.5。右移16位就是除以65536,為的是將高2字節移到正常的整數位上。我都說暈了,以后慢慢解釋給大家,呵呵。 ??? Fixed類型說了一堆,究竟來做什么的? ??? 比如上例中,Y軸每次都要偏移0.4,而這個數是個浮點,嚴重影響了運算速度。比如,我們后臺有一個數,用來計量Y軸本次的坐標,就叫做變量YY吧。X每次都加1,也就是XX++,Y每次加0.4,也就是YY+=0.4。為了提高速度,我們將YY升級到Fixed類型,YY每次加Fixed的0.4,也就是0.4*65536=26214,然后再四舍五入到整數類型,即YY+=26214,Y=(YY+32768)>>16。這樣,就得到了每次的整數Y,并且都是整數的加減和位運算,速度非常快 |
總結
以上是生活随笔為你收集整理的[原创] GUI原理2 - 矢量线条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写一下这两天的生活吧!开学了,也没有多少
- 下一篇: 面向对象的JavaScript编程