[转载]chinaui.com










[原创] 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,并且都是整数的加减和位运算,速度非常快


评论

该日志第一篇评论

发表评论

评论也有版权!