摘 要:直線的生成算法是圖形光柵化中最基本的算法,基于經(jīng)典的Bresenham算法,提出了一種新的直線生成算法,該算法通過直線的第一和第二像素行的像素點(diǎn)數(shù)目計算其他各個像素行的像素點(diǎn)數(shù)目,利用直線的對稱性,每執(zhí)行一次生成兩個像素行。算法中不包含浮點(diǎn)運(yùn)算和取整運(yùn)算,且算法的執(zhí)行次數(shù)減少,使得直線的生成速度加快。
關(guān)鍵詞:圖形光柵化;Bresenham算法;增量;誤差項(xiàng)
中圖分類號:TP301.6
直線是圖形中的基本元素,到目前為止已有很多種直線的生成算法,如數(shù)值微分法、中點(diǎn)畫線法和Bresenham算法[1],其中Bresenham算法研究的最多,它的原理是:以各行各列的像素為中心虛擬一組坐標(biāo)線,按直線上x坐標(biāo)從小到大的順序,計算直線與各個坐標(biāo)線的交點(diǎn),確定與該交點(diǎn)距離最小的像素。本文在研究了經(jīng)典的Bresenham算法以及諸多改進(jìn)算法之后,提出了一種快速的Bresenham直線生成改進(jìn)算法,既保留了Bresenham算法中無需浮點(diǎn)運(yùn)算和取整運(yùn)算的優(yōu)點(diǎn),又能使得每次計算生成一個像素行,極大地提高了算法的執(zhí)行效率。
1 Bresenham算法的基本思想
先考慮直線段位于第一象限、斜率|m|≤1時的掃描轉(zhuǎn)換過程從直線的第一個像素點(diǎn)(x0,y0)開始,以橫坐標(biāo)由大到小的順序依次尋找與直線最接近的像素點(diǎn)。如圖1所示,假設(shè)坐標(biāo)為(xk,yk)為直線的當(dāng)前像素點(diǎn),然后在列xk+1上確定掃描線y的值。
Bresenham算法的優(yōu)點(diǎn)在于使用增量計算,確定所選的像素。相對于其他直線的生成算法而言,它避免了乘除法運(yùn)算和取整運(yùn)算,效率較高。但是每次只能判斷一個誤差項(xiàng)的符號,生成一個像素點(diǎn)。因此,許多專家對Bresenham算法作了一些改進(jìn),基本上都是通過直線的斜率求每行的像素點(diǎn)個數(shù)[3],來提高直線的生成速度,但由于引進(jìn)了浮點(diǎn)運(yùn)算甚至除法運(yùn)算,使得整體的改進(jìn)效率提高不大。
2 快速的Bresenham直線生成改進(jìn)算法
設(shè)像素點(diǎn)P(xp,yp)為當(dāng)前的像素點(diǎn),則待選擇的像素點(diǎn)可能是點(diǎn)E或點(diǎn)G如圖2所示。設(shè)F(x,y)為需光柵化的直線函數(shù),點(diǎn)E和點(diǎn)G的中點(diǎn)為M,如果F(M)>0,則點(diǎn)M在該直線的下方,選則點(diǎn)G,如果F(M)≤0,則點(diǎn)M在直線上方,選則點(diǎn)E。Bresenham算法定義了一個判定變量d=F(xp+1,yp+1/2),通過d值的正負(fù)來選擇下一個像素點(diǎn)的坐標(biāo)[4]。
通過以上分析可以得知,通過Bresenham算法生成的直線除卻起始和終止兩行像素點(diǎn)外,中間各像素行的像素點(diǎn)個數(shù)滿足:Q≤e≤Q+1。
確定了像素行的第k個像素點(diǎn)的判定變量的符號,可以推斷該行的像素點(diǎn)個數(shù)。因?yàn)閐k=d1+2kdy-2dx,如果dk<0,該行的像素點(diǎn)個數(shù)為Q+1;如果dk>0,下一像素行的像素點(diǎn)個數(shù)為Q個,計算一次d值可以找到一個像素行的所有像素點(diǎn)。
本改進(jìn)算法的關(guān)鍵是求Q的值,本文大膽猜測使用直線的前兩行像素點(diǎn)個數(shù)求Q的值。通過數(shù)學(xué)分析證明,若Bresenham算法生成的直線的前兩個像素行分別有n和m個像素點(diǎn),則
可以通過兩種情況論證上述結(jié)論:
1)如果Bresenham算法生成的直線的第1個像素行的像素點(diǎn)個數(shù)為n,則2n-2≤dx/dy<2n,則該直線第n個像素點(diǎn)的d≤0,而第n+1個像素點(diǎn)的d>0,即 ,其中,d0=2dy-dx為d的初值,是直線第2個像素點(diǎn)的d值,將d0代入 ,得2n-2≤dx/dy<2n;
2)如果Bresenham算法生成的直線的第2個像素行有m個像素點(diǎn),則m-1≤dx/dy
3 算法及驗(yàn)證
將上述數(shù)學(xué)思想轉(zhuǎn)化為算法[6],程序如下。其中變量valuel,valueB是直線和背景的顏色值;函數(shù)Linel表示參照value取點(diǎn)共n個像素點(diǎn);由Bresenham算法生成前兩行以及末行像素,新算法生成其他各像素行。
在該算法中,沒有除法、取整以及浮點(diǎn)運(yùn)算,只通過兩次減法就求得了n和m,通過一次計算又求得了Q的值,每執(zhí)行一次就能生成一個像素行,另利用直線的對稱性,使得每執(zhí)行一次就能生成兩個像素行。將該算法在計算機(jī)上實(shí)現(xiàn),如表1所示,改進(jìn)算法與Bresenham算法相比效率明顯提高。
由算法的原理可知,當(dāng)待生成直線只有一個像素行時,改進(jìn)算法與Bresenham算法的生成速度相同,其他情況下,改進(jìn)算法的執(zhí)行速度都明顯高于經(jīng)典的Bresenham算法,且生成的像素行數(shù)越多,節(jié)省的執(zhí)行時間就越明顯。
4 結(jié)束語
本文在研究經(jīng)典Bresenham算法的基礎(chǔ)上,提出了一種快速的直線生成算法,利用直線的第一行像素點(diǎn)個數(shù)推出其他各像素行的像素點(diǎn)數(shù)目,充分利用直線的對稱性使得每執(zhí)行一次能生成兩個像素行,相對于經(jīng)典Bresenham算法每執(zhí)行一次只能生成一個像素點(diǎn)來說,極大地提高了直線的生成速度。
參考文獻(xiàn):
[1]James D Foley.計算機(jī)圖形學(xué)導(dǎo)論[M].北京:機(jī)械工業(yè)出版社,2004:48-56.
[2]Mel Slater.計算機(jī)圖形學(xué)與虛擬環(huán)境[M].北京:機(jī)械工業(yè)出版社,2004:270-272.
[3]Asiful Haque ,Mohammad Saifur Rahman ,Mehedi Bakht.Drawing lines by uniform packing[J].Computers Graphics,2006(02):207-212.
[4]鄭宏珍.改進(jìn)的Bresenham直線生成算法[J].中國圖像圖形學(xué)報,1999(07):606-608.
[5]SunYan.The parallel algorithm of Bresenham[J].Computer Engineering and Applications,2001(21):136-137.
[6]孫巖.并行的Bresenham直線生成算法[J].計算機(jī)工程與應(yīng)用,2001(21):136-137.
作者簡介:孫云(1989-),女,工學(xué)碩士,主要研究方向:圖形圖像處理。
作者單位:重慶理工大學(xué)計算機(jī)科學(xué)與工程學(xué)院,重慶 400054
基金項(xiàng)目:重慶市科學(xué)技術(shù)委員會科技攻關(guān)項(xiàng)(cstc2012gg-yyjs40011)。