国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種兩點(diǎn)-對稱的直線生成方法

      文檔序號:6612908閱讀:378來源:國知局
      專利名稱:一種兩點(diǎn)-對稱的直線生成方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及計(jì)算機(jī)圖形學(xué)領(lǐng)域,具體地說,是涉及一種兩點(diǎn)-對稱的直線生成方法。

      背景技術(shù)
      在顯示基于目標(biāo)地理位置的信息時,需要頻繁調(diào)用基礎(chǔ)圖形生成算法來進(jìn)行地理圖形描畫,因此高效的圖形描畫算法,即計(jì)算機(jī)圖形學(xué)基礎(chǔ)算法研究是該軟件平臺研究的關(guān)鍵之一。現(xiàn)有技術(shù)中,嵌入GIS設(shè)備幾乎都存在地理圖形描畫速度慢的問題。快速高效的圖形生成算法無疑會極大地改善地理信息服務(wù)的系統(tǒng)性能和效率,提高用戶滿意度和產(chǎn)品競爭力。
      在計(jì)算機(jī)圖形學(xué)領(lǐng)域以及更廣領(lǐng)域,直線是組成各種圖形的基本元素,可以通過像素生成許多離散的小直線段,來逼近欲生成的曲線和各種復(fù)雜圖形。因此,直線生成的效率是其它各類圖形生成效率的基礎(chǔ)。在嵌入系統(tǒng)GDI圖形庫的畫圖函數(shù)中,直線段生成的效率將直接決定整個圖形系統(tǒng)的性能和效率。
      對于直線的生成算法,40多年來,許多人進(jìn)行了深入的研究,并已出現(xiàn)許多有效的算法。在計(jì)算機(jī)圖形學(xué)基礎(chǔ)算法研究中,對于光柵掃描顯示器的基于像素的點(diǎn)式圖元生成來說,直線的生成算法總的來說可以分為三類第一類為單點(diǎn)生成算法,以效率最高的Bresenham直線生成算法為代表;第二類為行程長度算法。第三類為N步(N-Step)算法。有R.A.Eamshow的直線生成算法,X.Wu的雙步增量畫線算法,Mandelbret的用實(shí)型數(shù)的精確直線生成算法,Graham的并行生成直線法,J.R.Rankin提出的RB算法,P.Graham的改進(jìn)RB算法,DDA算法,劉永奎的直線對稱生成算法等等很多。對于單點(diǎn)直線生成算法,Bresemham算法的計(jì)算量已達(dá)到最小,也就是說單點(diǎn)畫線算法已無改進(jìn)余地。
      圖1是光柵掃描顯示器的直線顯示示意圖。光柵掃描顯示器的顯示屏是由許多被稱之為像素的點(diǎn)組成的,其分布排列形式是水平直線和垂直直線構(gòu)成的網(wǎng)格,當(dāng)我們要在顯示器上畫一條曲線時要逐點(diǎn)地選擇離曲線最近的像素點(diǎn)將其點(diǎn)亮,這就是像素級的生成方法,生成的圖形精度小于1/2個像素。對于光柵掃描顯示器而言,點(diǎn)是最基本的元素,這里的點(diǎn)不是理想的幾何上的點(diǎn),而是一個像素。圖1中所示的是直線的像素生成效果,理想的像素(實(shí)心圓)分布與實(shí)際的像素(空心橢圓)分布是不同的,這是因?yàn)橄袼厥怯幸欢ù笮〉?,并且坐?biāo)值是整數(shù)值。我們希望表示一條直線的像素點(diǎn)集合應(yīng)該分布的盡可能均勻,而且像素點(diǎn)盡可能地靠近線段。圖中的陰影方框,表示的是以理想的像素為中心的實(shí)際物理顯示器像素。
      計(jì)算機(jī)圖形學(xué)基礎(chǔ)算法的研究已經(jīng)有40余年的歷史,其發(fā)展已經(jīng)相當(dāng)成熟,但是基礎(chǔ)算法的微小進(jìn)步就會可觀地改善圖形系統(tǒng)效率。因此,研究、改善和優(yōu)化基礎(chǔ)圖形生成算法有著很重要的意義。


      發(fā)明內(nèi)容
      本發(fā)明所要解決的技術(shù)問題是在于需要提供一種兩點(diǎn)-對稱的直線生成方法,以提高圖形系統(tǒng)中直線的生成效率。
      為了解決上述技術(shù)問題,本發(fā)明提供了一種兩點(diǎn)-對稱的直線生成方法,其特征在于 根據(jù)直線始端像素點(diǎn)一次生成直線始端側(cè)的兩個后趨像素點(diǎn),其中,距離所述始端像素點(diǎn)較遠(yuǎn)的后趨點(diǎn)為始端側(cè)第一后趨像素點(diǎn),所述始端像素點(diǎn)與所述始端側(cè)第一后趨像素點(diǎn)之間的后趨像素點(diǎn)為始端側(cè)第二后趨像素點(diǎn); 按照同趨規(guī)則,根據(jù)直線終端像素點(diǎn),一次生成直線終端側(cè)的兩個后趨像素點(diǎn),其中,距離所述終端像素點(diǎn)較遠(yuǎn)的后趨點(diǎn)為終端側(cè)第一后趨像素點(diǎn),所述終端像素點(diǎn)與所述終端側(cè)第一后趨像素點(diǎn)之間的后趨像素點(diǎn)為終端側(cè)第二后趨像素點(diǎn); 將所述始端側(cè)第一后趨像素點(diǎn)作為始端側(cè)當(dāng)前的始端像素點(diǎn),將所述終端側(cè)第一后趨像素點(diǎn)作為終端側(cè)當(dāng)前的終端像素點(diǎn),以2個像素單位為步進(jìn)長度,循環(huán)生成所述直線剩余的像素點(diǎn)。
      上述的直線生成方法中,根據(jù)所述始端像素點(diǎn)一次生成所述始端側(cè)的兩個后趨像素點(diǎn),可以包括將坐標(biāo)空間的四個象限按照斜率2或1/2劃分為16個卦限,通過模式判斷一次生成所述始端側(cè)的兩個后趨像素點(diǎn)。
      進(jìn)一步地,所述模式判斷所采用的模式種類在每個卦限內(nèi)可以是確定的。更進(jìn)一步地,所述模式種類在每個卦限內(nèi)可以為3種。
      上述的直線生成方法中,如果所述直線在除去所述直線始端像素點(diǎn)和所述直線終端像素點(diǎn)后,剩余的像素點(diǎn)數(shù)量用4整除后還有余數(shù),則可以以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,生成所述直線上與所述余數(shù)對應(yīng)的所述始端側(cè)與所述終端側(cè)中間的接點(diǎn)。
      進(jìn)一步地,所述余數(shù)為1,對應(yīng)的所述接點(diǎn)為1個,可以以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,生成所述接點(diǎn); 所述余數(shù)為2,對應(yīng)的所述接點(diǎn)為2個,可以以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,首先生成所述接點(diǎn)中距離所述當(dāng)前的始端像素點(diǎn)較近的那1個接點(diǎn),然后再生成剩余的那1個接點(diǎn);及 所述余數(shù)為3,對應(yīng)的所述接點(diǎn)為3個,可以以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,首先生成所述接點(diǎn)中距離所述當(dāng)前的始端像素點(diǎn)最近的第1個接點(diǎn),然后再生成距離所述當(dāng)前的始端像素點(diǎn)次近的第2個接點(diǎn),最后將所述第1個接點(diǎn)對稱到所述終端側(cè),得到所述接點(diǎn)中剩余的那個接點(diǎn)。
      與現(xiàn)有技術(shù)相比,本發(fā)明一次采用步進(jìn)為2的迭代方法,加上直線本身具有的對稱性,一次迭代即可生成四個點(diǎn),因此較現(xiàn)有技術(shù)相比,有效提高了直線的生成效率,是一種實(shí)用、快速的直線生成方法。



      圖1是光柵掃描顯示器的直線顯示示意圖。
      圖2A和圖2B是Bresenham單點(diǎn)畫線示意圖。
      圖3A是把坐標(biāo)空間的八個卦限按照斜率2進(jìn)行劃分的示意圖。
      圖3B是Freeman鏈碼示意圖。
      圖4是兩點(diǎn)法在第一象限內(nèi)畫直線時像素的模式示意圖。
      圖5A和圖5B是柵格顯示器上直線段像素的示意圖。
      圖6是本發(fā)明方法實(shí)施例的步驟示意圖。
      圖7是本發(fā)明方法在斜率為
      時始端側(cè)后趨點(diǎn)生成示意圖。
      圖8是與圖7所示情形相對稱的終端側(cè)后趨點(diǎn)生成示意圖。

      具體實(shí)施例方式 以下結(jié)合附圖和對本發(fā)明作進(jìn)一步地詳細(xì)說明。
      為了便于更好地理解和實(shí)施本發(fā)明,以下先簡單闡述Bresenham算法的內(nèi)容。由Bresenham提出的直線生成算法實(shí)際上也是簡單的DDA算法。即在某一計(jì)長方向上,每次必變化一個單位步長或一個像素單位,另一個方向上的變化量可以通過計(jì)算得到,也即通過浮點(diǎn)運(yùn)算和四舍五入來選下一個點(diǎn)。但是Bresenham方法對下一個點(diǎn)的選擇,是通過判斷一個反復(fù)迭代的誤差因子是否大于零來進(jìn)行的。在迭代計(jì)算誤差因子的時候,只用到了整型數(shù)加法和移位操作,計(jì)算量很小,因而得到了廣泛的應(yīng)用。
      Bresenham單點(diǎn)畫線方法假設(shè)被描畫的直線段在二維坐標(biāo)平面中從始點(diǎn)(x1,y1)到終點(diǎn)(x2,y2),假設(shè)x1<x2。經(jīng)變換后可以表示為從(0,0)到(dx,dy),其中dx=x2-x1,表示X軸方向上的變化;dy=y(tǒng)2-y1,表示Y軸方向上的變化。此時直線方程可以化簡為 (式1) 在圖2A和圖2B所示的Bresenham單點(diǎn)畫線示意中,如果假設(shè)已經(jīng)生成的當(dāng)前點(diǎn)Pi-1的坐標(biāo)為(r,q),則Si的坐標(biāo)為(r+1,q),Ti的坐標(biāo)為(r+1,q+1),由表達(dá)式1可以知道,直線理論上應(yīng)該描畫的精確點(diǎn)距離下一個實(shí)際上可以選擇的像素Ti和Si的距離t和s分別為 (式2) (式3) 由此,可知 (式4) 這樣,就可以通過s和t的大小關(guān)系來選擇下一個點(diǎn)應(yīng)該畫Si還是Ti。但由于式2中dx>0,可以用dx(s-t)的正、負(fù)來知道s、t的大小關(guān)系,從而作為選擇下一個像素點(diǎn)Si和Ti的標(biāo)準(zhǔn)。事實(shí)上,由(3-2)式我們還知道,dx(s-t)必然是一個整數(shù)值,因?yàn)檎麛?shù)乘、加、減的結(jié)果還是整數(shù),這就可以免去對浮點(diǎn)運(yùn)算的要求。若令dx(s-t)=di,則di就是第i步的誤差因子,當(dāng)di>=0時,s>=t,要選擇Ti點(diǎn)(如圖2A所示),否則選擇Si點(diǎn)(如圖2B所示),將di=dx(s-t),r=xi-1,q=y(tǒng)i-1代入式4可得 di=2(xi-1·dy-yi-1·dx)+2dy-dx (式5) 因(x0,y0)=(0,0)(將直線起始點(diǎn)都抽象為(0,0)點(diǎn)),i=1,由上式可得到di的初值為d1=2dy-dx。為了求出第i+1步和第i步的誤差因子迭代關(guān)系,可以用i+1代替式(3-5)中的i,得到 di+1=2(xi·dy-yi·dx)+2dy-dx(式6) 從di+1中減去di得 di+1-di=2dy(xi-xi-1)-2dx(yi-yi-1) (式7) 因?yàn)閤i-xi-1=1,由上式可得 di+1=di+2dy-2dx(yi-yi-1)(式8) 如果當(dāng)前的誤差因子di<0,選點(diǎn)Si,yi=y(tǒng)i-1,那么下一步的誤差因子di+1應(yīng)該為 di+1=di+2dy(式9) 如果di>=0,選點(diǎn)Ti,yi=y(tǒng)i-1+1,那么下一步的誤差因子di+1應(yīng)該為 di+1=di+2(dy-dx) (式10) 這樣我們就有了迭代公式,如表達(dá)式9和表達(dá)式10所示。由此,可以根據(jù)當(dāng)前點(diǎn)的誤差因子di方便地計(jì)算出下一個點(diǎn)的誤差因子di+1。還可以根據(jù)當(dāng)前點(diǎn)di是否大于零實(shí)現(xiàn)對下一個像素Si或Ti進(jìn)行快速選擇。有了誤差因子的初始值和迭代公式,就可以用循環(huán)的點(diǎn)生成來畫出整條直線,下面描述了線段的生成過程。
      當(dāng)生成線段的第一個像素點(diǎn)后,判斷并迭代當(dāng)前點(diǎn)的誤差因子d。如果d大于等于0,則使用迭代公式(3-9)更新誤差因子,并生成下一個像素點(diǎn)Si的坐標(biāo),否則使用迭代公式(3-10)更新誤差因子,并生成下一個像素點(diǎn)Ti的坐標(biāo)。然后描畫出第二個像素點(diǎn)。重復(fù)以上步驟共dx次,就生成了整個線段。
      當(dāng)把坐標(biāo)空間的四個象限按照斜率1劃分為8個卦限時,由于XY平面各種8分和4分區(qū)域間的對稱性,我們可以通過對稱、反演使所有的直線都映射到斜率
      區(qū)間的情況來處理,從而簡化實(shí)際操作的程序。
      下面闡述兩點(diǎn)-對稱法中的兩點(diǎn)生成法。使用Bresenham方法可以使畫點(diǎn)運(yùn)算量很小,但是每次只能畫一個點(diǎn)。可以考慮使用Freeman鏈碼理論對其進(jìn)行改進(jìn),當(dāng)發(fā)現(xiàn)直線在特定的斜率區(qū)域內(nèi)時,直線的點(diǎn)陣序列有一定的規(guī)律性,通過前面點(diǎn)的特征可以推斷后面若干的點(diǎn)的分布。例如,把坐標(biāo)空間的八個卦限按照斜率2(1/2)劃分為圖3A所示的16個部分時,在某卦限內(nèi),直線的點(diǎn)陣分布僅有圖4所示的三種情況,可以通過模式判斷(比較)來一次畫出兩個點(diǎn),總的計(jì)算量為一次求點(diǎn)計(jì)算、兩次比較??梢员菳resenham單點(diǎn)生成畫法速度快1到2倍。
      出于模式識別的目的,以圖3B所示的不同斜率的8個小箭頭直線段作為基元,來描述線畫圖形,即Freeman鏈碼,圖中的圓可以認(rèn)為是光柵點(diǎn)或像素,并指出一條直線的鏈碼應(yīng)滿足下面3個條件 ①最多只有兩個相鄰基元(碼)出現(xiàn); ②上述兩個基元(碼)的其中之一只能單個出現(xiàn)(不會連續(xù)出現(xiàn)); ③這個單獨(dú)出現(xiàn)的基元(碼)一定是均勻分布在整個直線鏈碼中。
      在光柵顯示器上生成直線的過程可以理解為對直線編碼過程。從直線上的一個點(diǎn)移到下一個點(diǎn),一定對應(yīng)著Freeman鏈碼的8個基元之一。由條件①和②可知,在生成直線時,最多只可能有8個基元中的兩個相鄰的基元出現(xiàn)在該直線的鏈碼中,在這種只由這兩個基元組成的鏈碼中其中有一個基元不會連續(xù)出現(xiàn),這就意味著該基元出現(xiàn)之后,必然是另外一個基元出現(xiàn)。這就說明,存在不用計(jì)算就可以預(yù)測后趨點(diǎn)的可能性。當(dāng)然,水平垂直線和斜率為正負(fù)1的直線,只會出現(xiàn)一個基元連續(xù)的情況,這時直線的生成可以不用計(jì)算而直接裝入幀緩沖器。
      按上面的思路,把XY平面所有的直線按其斜率2和1/2劃分為圖3A的16部分時,在第1部分,只有Freeman基元“0”、“1”出現(xiàn),其中基元“1”是單獨(dú)出現(xiàn)的,基元“1”后,必然會出現(xiàn)一個或多個基元“0”。以下結(jié)合圖4所示的兩點(diǎn)法在第一象限內(nèi)畫直線時像素的模式,直線在特定的斜率區(qū)域內(nèi)時,直線的點(diǎn)陣序列有一定的規(guī)律性,通過前面點(diǎn)的特征可以推斷后面若干的點(diǎn)的分布。當(dāng)我們把坐標(biāo)空間的八個卦限按照斜率2(1/2)劃分為圖3A所示的16個部分時,在某卦限內(nèi),直線的點(diǎn)陣分布最多僅有圖4所示mode42、mode43和mode44共三種情況,可以通過模式判斷(比較)來一次畫出兩個點(diǎn),總的計(jì)算量為一次求點(diǎn)計(jì)算、兩次比較??梢员菳resenham單點(diǎn)生成畫法速度快1到2倍。
      繼續(xù)參閱圖4,mode41這一行,表示的是直線的斜率在0到1/2之間;mode44這一行,表示的是直線的斜率在1/2到1之間;mode45這一行,表示的是直線的斜率在1到2之間;mode47這一行,表示的是直線的斜率大于2。
      在圖3A的第2部分,只有Freeman基元“0”、“1”出現(xiàn),其中基元”0”是單獨(dú)出現(xiàn)的,基元“0”后,必然會出現(xiàn)一個或多個基元“1”。同樣在其他的部分,也是有類似規(guī)律。由于對稱性,僅列出了第一象限的四個區(qū)間的情況。其余象限可參考第一象限,不再詳細(xì)描述。事實(shí)上,解決了第一象限的直線段生成問題,其它象限的情況就都同時得到了解決。設(shè)計(jì)出了
      區(qū)間的算法,由于坐標(biāo)對換對稱性,就解決了第一象限的算法問題。
      下面分析一下循環(huán)(運(yùn)算)次數(shù)問題,對斜率處于圖3A第1部分的直線來說,本來單像素點(diǎn)生成的循環(huán)次數(shù)應(yīng)為dx,兩點(diǎn)生成情況下每當(dāng)基元“1”出現(xiàn)時,一次運(yùn)算可以生成兩個點(diǎn),應(yīng)減去基元“1”出現(xiàn)的次數(shù),即dy,所以循環(huán)次數(shù)應(yīng)為dx-dy。對于斜率處于第二部分的直線,無論每次循環(huán)生成一個還是兩個點(diǎn),y坐標(biāo)都要加1,所以循環(huán)次數(shù)應(yīng)為dy。那么,兩點(diǎn)法可以比單點(diǎn)生成法快多少呢?這其實(shí)還要取決于直線斜率。平均的來說,有1/2的概率一次生成兩個點(diǎn)。
      下面闡述兩點(diǎn)-對稱法中的對稱原理。圖5A和圖5B表示出了柵格顯示器上直線段像素的對稱性,兩者表示的是同一條直線,其中圖5A表示的是幾何坐標(biāo)系,斜率大于1;而圖5B表示的是屏幕坐標(biāo)系,斜率小于1。從圖5A和圖5B中可以發(fā)現(xiàn)對稱原理以直線中點(diǎn)為界,其兩邊的像素是對稱的,這樣每算出一邊的點(diǎn)就可以利用對稱畫出另一邊的點(diǎn),這樣直線的生成是從兩端向中間進(jìn)行的。
      當(dāng)直線端點(diǎn)的坐標(biāo)為整數(shù)時,可以發(fā)現(xiàn)以直線理想中點(diǎn)對稱的兩段直線的點(diǎn)陣序列趨勢相同,也就是說兩邊的像素排列是完全對稱的。如果利用這個對稱性,就可以進(jìn)行一次判斷便生成關(guān)于直線理想中點(diǎn)對稱的兩個點(diǎn)。所以,可以在計(jì)算生成一邊的一個或多個點(diǎn)后直接對稱地生成另一邊的一個點(diǎn)或多個點(diǎn),即按照同趨規(guī)則求出另一邊的點(diǎn)。
      單點(diǎn)對稱算法需要注意中間點(diǎn)的處理問題,當(dāng)生成的線段的像素總數(shù)為奇數(shù)時,要單獨(dú)生成中間這一個點(diǎn)。但是在中間點(diǎn)的誤差因子剛好等于零時,從線段的不同端點(diǎn)開始生成的中間點(diǎn)是不確定的,這樣從不同的端點(diǎn)開始生成同一條線段,就會在中間多出一點(diǎn),后來對算法進(jìn)行了改進(jìn),也就是把中間多余出來1、2或3個點(diǎn)單獨(dú)生成,就可以解決這個問題。對稱算法可以使直線的生成速度快兩倍。當(dāng)然,“兩點(diǎn)-對稱”描畫方法要也要把中間多余出來的點(diǎn)單獨(dú)生成。
      結(jié)合圖6所示本發(fā)明方法實(shí)施例的步驟示意,以下闡述兩點(diǎn)-對稱方法的主要技術(shù)特點(diǎn),把坐標(biāo)空間的四個象限按照斜率2(1/2)劃分為16個卦限,在某卦限內(nèi)直線的點(diǎn)陣僅有三種情況(如步驟601所示);在直線始端,可以通過模式判斷(比較)來一次生成兩個像素點(diǎn),也即在始端可以根據(jù)始端側(cè)當(dāng)前點(diǎn)一次生成兩個始端后趨像素點(diǎn)(如步驟602所示);再按照同趨規(guī)則,在直線終端側(cè)對稱地得到終端當(dāng)前像素點(diǎn)的兩個后趨像素點(diǎn)(如步驟603所示)。
      由二維坐標(biāo)平面坐標(biāo)的對稱性可以知道,解決了直線斜率在區(qū)間
      中的直線生成問題,就解決了所有斜率的直線在整個坐標(biāo)平面的生成問題。
      請參閱之前的圖2A和圖2B,兩圖示出了在斜率區(qū)間
      中直線的生成過程中對點(diǎn)的選擇情況。其中Pi-1表示當(dāng)前已經(jīng)選定的離直線最近的像素,Pi-1的后續(xù)第一個點(diǎn)要選擇Ti或Si,如果s>=t,Ti較Si更靠近直線,則應(yīng)選擇畫像素Ti;如果s<t,Si比較靠近直線,應(yīng)選擇畫像素Si。Pi-1后續(xù)的第二個點(diǎn)要選擇Ti+1或Si+1,同樣要根據(jù)m和n的大小來選擇Ti+1或Si+1。
      Bresenham算法的核心是計(jì)算誤差因子的初始值和迭代公式,下面將導(dǎo)出兩點(diǎn)Bresenham生成法的誤差迭代公式,也就是點(diǎn)的生成判據(jù)問題,按照直線斜率在
      內(nèi),在[1/2,1]內(nèi),以及在
      之外等情況分別論述。
      (一)首先論述直線斜率在區(qū)間
      中的兩點(diǎn)算法。
      由圖4可知,在斜率區(qū)間
      中點(diǎn)的排列模式僅有圖4中的mode41、mode42和mode43共三種情形,圖2B示出了在斜率區(qū)間
      中點(diǎn)的選擇情況,在此情況下設(shè)Pi-1是已選定的離直線最近的像素,我們要先計(jì)算其后第二個像素是Si+1還是Ti+1,然后再判斷其后第一個像素是Si還是Ti。因?yàn)槿暨x擇了Si+1,那么不用計(jì)算一定要選擇Si,若選擇了Ti+1,那么在下面通過構(gòu)造一個選擇判據(jù)C來對Si還是Ti進(jìn)行選擇。
      設(shè)Pi-1的坐標(biāo)為(r,q),Si+1的坐標(biāo)為(r+2,q),Ti+1的坐標(biāo)為(r+2,q+1),把即將生成的直線(x0,y0)-(x1,y1)簡化為(0,0)-(dx,dy),直線方程可表示為式1所示。
      代入Si+1和Ti+1的坐標(biāo)并對理想點(diǎn)的y坐標(biāo)求差可以得到 (式11) (式12) 由此可得 (式13) 設(shè)(m-n)dx=di,因?yàn)閐x>0,當(dāng)di<0時m<n,所以應(yīng)當(dāng)選擇Si+1點(diǎn),當(dāng)di>=0時,m>=n,所以應(yīng)當(dāng)選擇Ti+1點(diǎn),把r=xi-1、q=y(tǒng)i-1代入上式得 di=2(xi-1·dy-yi-1·dx)+4dy-dx (式14) 所以,可以用i+2代替i(增加2單位步長)得到 di+2=2xi+1·dy-yi+1·dx)+4dy-dx(式15) 從di+2中減去di得到 di+2-di=2dy(xi+1-xi-1)-2dx(yi+1-yi-1) (式16) 因?yàn)閤i+1-xi-1=2,式16為 di+2=di+4dy-2dx(yi+1-yi-1) (式17) 如果di<0,選點(diǎn)Si+1,則yi+1=y(tǒng)i-1,式17可表示為如下的誤差因子迭代公式 di+2=di+4dy(式18) 如果di>=0,選點(diǎn)Ti+1,則yi+1=y(tǒng)i-1+1,式17可表示為如下的誤差因子迭代公式 di+2=di+4dy-2dx(式19) (x0,y0)=(0,0)代入式14可以方便地得到di的初值,即d1=4dy-dx。
      根據(jù)生成的第i個像素時的di值得到di+2的值,從而可以方便地判斷出第i+2個像素的選擇情況(Ti+1或Si+1)?,F(xiàn)在還有一個問題第i+1個像素是選擇Ti還是Si。
      由圖2B可知,在確定第i-1個像素為Pi-1且第i+1個像素選擇Si+1時,第i個像素可以直接選擇Si,然而在第i+1個像素選擇Ti+1時,第i個像素是選擇Si還是選擇Ti,是需要判斷一下的,不妨考慮式13減去式4得到 (m-n)dx-(s-t)dx=2dy=C (式20) 其中,C即為前述的選擇判據(jù),式20可變換為 (m-n)dx-2dy=(s-t)dx (式21) 因?yàn)閐x>0,當(dāng)(s-t)·dx<0時,s<t,此時第i個像素應(yīng)該選擇Si,(s-t)·dx>=0時要選擇Ti。又因?yàn)?m-n)·dx=di,由式21可以知道,di<2dy時選擇Si,di>=2dy時選擇Ti。令C=2dy,可以按照兩點(diǎn)法生成的第i個像素時的誤差因子di值與C值作一個比較,從而可以方便地判斷出第i個像素應(yīng)該選擇Ti還是Si。
      由此可知從直線始點(diǎn)開始,使用與Bresenham單點(diǎn)算法一樣的流程來生成后趨點(diǎn),不同的是每次運(yùn)算步進(jìn)為2,要生成兩個點(diǎn)。在得到直線始端側(cè)當(dāng)前點(diǎn)位置后,根據(jù)上述誤差因子迭代公式也即式18和式19來進(jìn)行誤差迭代,步長為2,先判斷始端側(cè)當(dāng)前點(diǎn)后面的第二個點(diǎn)也即當(dāng)前點(diǎn)第二后趨點(diǎn)的位置,然后再根據(jù)式21來判斷出始端側(cè)當(dāng)前點(diǎn)后面的第一個點(diǎn)也即始端側(cè)當(dāng)前點(diǎn)與當(dāng)前點(diǎn)第二后趨點(diǎn)中間那一點(diǎn),稱之為當(dāng)前點(diǎn)第二后趨點(diǎn)的位置,并將當(dāng)前點(diǎn)第二后趨點(diǎn)作為新的始端側(cè)當(dāng)前點(diǎn),以此為基礎(chǔ)進(jìn)行后續(xù)判斷。
      (二)論述完直線斜率在區(qū)間
      中的兩點(diǎn)算法之后,緊接著論述直線斜率在區(qū)間[1/2,1]中的兩點(diǎn)算法。
      在斜率區(qū)間[1/2,1]中點(diǎn)的排列模式僅有圖4中mode44這一列所示的三種排列模式,圖2A表示出了在斜率區(qū)間[1/2,1]中對當(dāng)前點(diǎn)Pi-1來說,后續(xù)第一個點(diǎn)Si或Ti,后續(xù)第二個點(diǎn)Si+1或Ti+1的選擇情況圖解。
      在圖2A中,Pi-1的坐標(biāo)為(r,q),Si+1的坐標(biāo)為(r+2,q+1),Ti+1的坐標(biāo)為(r+2,q+2),Si的坐標(biāo)為(r+1,q),Ti+1的坐標(biāo)為(r+1,q+1),由前述內(nèi)容不難得出對點(diǎn)Si+1和Ti+1的誤差因子di,及di+2和di的差值迭代公式,還有對點(diǎn)Si和Ti的選擇判據(jù)C,以及di的初值,其中 di+2和di的差值迭代公式 di+2=di+4dy-2dx(di<0,選擇Si+1點(diǎn))(式22) di+2=di+4dy-4dx(di>=0,選擇Ti+1點(diǎn)) (式23) di的初值 d1=4dy-3dx(式24) 對點(diǎn)Si和Ti的選擇判據(jù)C,令 di-C=(s-t)dx (式25) 因di=(m-n)dx,所以 C=(m-n)dx-(s-t)dx=2dy-2dx(式26) 因此,當(dāng)di<C時,(s-t)dx<0,s<t,所以選擇Ti點(diǎn);當(dāng)di>=C時選擇Si點(diǎn)。
      (三)論述完直線斜率在區(qū)間
      和[1/2,1]中的兩點(diǎn)算法之后,緊接著論述直線斜率在區(qū)間
      之外時的兩點(diǎn)算法。
      當(dāng)直線斜率在第一象限大于1時,只要把斜率
      區(qū)間中的判據(jù)迭代公式中的dx、dy對換一下即可。
      在給定二維坐標(biāo)平面內(nèi)其它象限所有直線的生成,均可以通過對稱變換,使用斜率在第一象限中的直線生成算法來完成。
      前面論述了兩點(diǎn)Bresenham算法,在這里加入“對稱算法”思想改進(jìn)之。將“兩點(diǎn)法”與“對稱算法”結(jié)合形成“4點(diǎn)畫線算法”。即在直線的始端先用兩點(diǎn)法計(jì)算生成2個點(diǎn),然后再利用對稱性,不用計(jì)算而直接畫出終端對稱的兩個點(diǎn),這樣就可以只用一次計(jì)算就生成4個點(diǎn),其中2個在始點(diǎn)附近、另2個在終點(diǎn)附近。圖7表示出了在斜率
      中用兩點(diǎn)法生成的兩個點(diǎn)的所有情況,其中mode71表示了斜率等于1時的情形,mode72表示了斜率小于1時的情形,mode73表示了斜率大于1時的情形,mode74表示了斜率等于0時的情形。圖7中空心圓表示當(dāng)前點(diǎn),實(shí)心圓表示當(dāng)前點(diǎn)后邊的兩個后趨點(diǎn)。圖8示出了分別與圖7所示共4中情形相對稱的兩個點(diǎn)的情況,其中mode81與mode71相對應(yīng),mode82與mode72相對應(yīng),mode83與mode73相對應(yīng),mode84與mode74相對應(yīng)。圖7表示從始點(diǎn)向終點(diǎn)方向生成,圖8表示從終點(diǎn)向始點(diǎn)方向?qū)ΨQ生成,圖8對稱的點(diǎn)可以采用圖7中已生成的點(diǎn)按照相反的步進(jìn)規(guī)則,也即前述的同趨規(guī)則直接畫出。
      下面舉例說明對稱點(diǎn)的畫法,例如圖7中的mode72,如果當(dāng)前點(diǎn)的坐標(biāo)是(x,y),生成的兩個后趨點(diǎn)坐標(biāo)為(x+stepx,y+stepy)、(x+stepx+stepx,y+stepy),根據(jù)對稱關(guān)系,此時當(dāng)前點(diǎn)的對稱點(diǎn),以及該對稱點(diǎn)其兩個后趨點(diǎn)分別為(x’,y’)、(x’-stepx,y’-stepy)和(x’-stepx-stepx,y’-stepy)。對稱生成的第一個點(diǎn)是線段的終點(diǎn),不需要計(jì)算。那么,這里就有了初始狀態(tài)和一個確定的迭代、對稱關(guān)系,可以循環(huán)步進(jìn)生成始端部分、對稱的生成終端部分的點(diǎn),計(jì)算量減少到了一半。
      直線對稱生成還存在的一個問題是直線中間的接頭點(diǎn)怎么畫?由于每次計(jì)算循環(huán)可以生成4個點(diǎn),所以主循環(huán)的長度應(yīng)該是整個線段dx除4取整。如果,dx不是4的整數(shù)倍,這時還會剩余1、2或3個點(diǎn)是需要單獨(dú)生成的,對應(yīng)的從始點(diǎn)方向生成1、2點(diǎn),剩余點(diǎn)為3時再對稱的生成1點(diǎn)即可。與Bresenham單點(diǎn)算法相比,本發(fā)明方法可以將畫線效率提高2~3倍。
      使用隨機(jī)數(shù)產(chǎn)生器產(chǎn)生100萬對直線線段端點(diǎn),分別用Bresenham單點(diǎn)生成算法與本發(fā)明方法進(jìn)行了直線段生成速度測試,共測10次,取平均值。對隨機(jī)產(chǎn)生100萬對線段端點(diǎn)的時間單獨(dú)測試,取其平均值,把總的時間減去隨機(jī)數(shù)的產(chǎn)生時間,就是線段的生成時間。線段的生成時間沒有包含寫像素的時間,測試結(jié)果表1所示。測試環(huán)境為Pentium 4,x86 Family 6 Mode418 Stepping 3,GenuineIntel,Win2000??梢娪脝吸c(diǎn)法生成100萬條線段的平均時間是8494-721=7773ms,用本發(fā)明方法生成100萬條線段的平均時間是3871-721=3150ms,是單點(diǎn)法生成時間的40.5%,加速比為2.468。由于多余的處理計(jì)算和不同斜率時的生成速度不同的原因,雖然本發(fā)明方法可以一次生成2或4個點(diǎn),但是加速比沒有突破3。表1示出了采用本發(fā)明兩點(diǎn)對稱生成直線的方法與單點(diǎn)生成直線的方法進(jìn)行測試比較的結(jié)果 表1、本發(fā)明方法與單點(diǎn)生成方法測試比較結(jié)果表 下面通過另一個較具體的實(shí)施例來更進(jìn)一步詳細(xì)地說明本發(fā)明兩點(diǎn)對稱生成直線的方法。由于對稱性,仍然先考慮第一象限斜率
      區(qū)間中的情況。第一象限斜率
      之外的情況,以及其余象限的情況,均可按照第一象限斜率
      區(qū)間對稱獲得。設(shè)斜率為k=
      ,關(guān)鍵變量的定義如下 主循環(huán)的長度length=(dx-1)>>2,迭代循環(huán)計(jì)算一次可畫出4個點(diǎn),在直線確定了首尾兩點(diǎn)之后,將其余像素點(diǎn)除4取整,得到的結(jié)果即為主循環(huán)的循環(huán)步數(shù),在主循環(huán)之內(nèi),每次都是根據(jù)直線始點(diǎn)這一側(cè)的當(dāng)前點(diǎn),也即前述的始端側(cè)當(dāng)前點(diǎn),首先得到始端側(cè)當(dāng)前點(diǎn)的第一后趨點(diǎn),然后獲取始端側(cè)當(dāng)前點(diǎn)與始端側(cè)第一后趨點(diǎn)之間的那個點(diǎn),也即前述的始端側(cè)當(dāng)前點(diǎn)的第二后趨點(diǎn);再按照同趨原則,以終端當(dāng)前點(diǎn)為基礎(chǔ),得到終端側(cè)當(dāng)前點(diǎn)的第一后趨點(diǎn),以及終端當(dāng)前點(diǎn)與終端側(cè)第一后趨點(diǎn)之間的終端側(cè)當(dāng)前點(diǎn)的第二后趨點(diǎn)。
      中間接點(diǎn)個數(shù)如果直線段所有像素點(diǎn)減去首尾兩點(diǎn),除4之后還有余數(shù)extras,那么再針對余數(shù)為1、2或3分別進(jìn)行處理。
      當(dāng)前點(diǎn)后續(xù)第一個點(diǎn)的選擇判據(jù)C值 C=2dy (k<1/2)(式27) C=2dy-2dx (k>=1/2) (式28) 當(dāng)前點(diǎn)后續(xù)第二個點(diǎn)的誤差因子di的迭代公式 di+1=di+4dy-2dx (di>=0,k<1/2) (式29) di+1=di+4dy (di<0,k<1/2) (式30) di+1=di+4dy-2dx (di>=0,k>=1/2) (式31) di+1=di+4dy-4dx (di<0,k>=1/2) (式32) di的初值d1 d1=4dy-dx(k<1/2) (式33) d1=4dy-3dx (k>=1/2)(式34) 在斜率大于1時只要把上面迭代變量中dx與dy對換即可,而對應(yīng)的畫點(diǎn)模式則相應(yīng)的按照圖4所示的情況調(diào)整,分別是Mode41對應(yīng)Mode47、Mode42對應(yīng)Mode45、Mode43對應(yīng)Mode46,而Mode44不變,替換一下即可。
      如果直線再除去首尾兩點(diǎn)之后所有的點(diǎn)不能被4整除,那么在主循環(huán)結(jié)束后,直線的中間有extras個接點(diǎn)需要單獨(dú)計(jì)算,直線的中間接點(diǎn)獲取方法具體為,將整除部分始端側(cè)最后一個點(diǎn)作為獲取直線中間接點(diǎn)的當(dāng)前點(diǎn),在此基礎(chǔ)上獲取extras個接點(diǎn),獲取方法是根據(jù)主循環(huán)結(jié)束時的誤差因子dlength-1與0、選擇判據(jù)C的關(guān)系來判斷后續(xù)兩個點(diǎn)的坐標(biāo)位置。具體地,extras的值可有三種情況,其中 當(dāng)extras=1時,根據(jù)dlength-1與0的大小關(guān)系來確定這個點(diǎn)的位置; 當(dāng)extras=2時,根據(jù)dlength-1與0的大小關(guān)系確定直線始端側(cè)距離當(dāng)前點(diǎn)較近的那個點(diǎn)的位置,根據(jù)dlength-1與C的大小關(guān)系來確定剩余的那個點(diǎn),也即距離該當(dāng)前點(diǎn)較遠(yuǎn)的那個點(diǎn)的位置; 當(dāng)extras=3時,采用與上述extras=2時的方法獲取當(dāng)前點(diǎn)的兩個后趨點(diǎn),然后再將離當(dāng)前點(diǎn)最近的那個后趨點(diǎn)對稱到直線終端側(cè)即可。
      本發(fā)明可以通過無線定位技術(shù)和GIS技術(shù)的結(jié)合,經(jīng)嵌入式用戶終端(手機(jī)等)的圖形顯示系統(tǒng)來告訴用戶需要的地理位置圖形信息。本發(fā)明屬于GDI基礎(chǔ)圖形生成領(lǐng)域,尤其涉及需要快速直線生成的應(yīng)用。如嵌入式地理信息系統(tǒng)、導(dǎo)航系統(tǒng)中地理圖形等基礎(chǔ)圖形生成系統(tǒng)之中。
      應(yīng)當(dāng)理解的是,對本發(fā)明技術(shù)所在領(lǐng)域的普通技術(shù)人員來說,可以根據(jù)本發(fā)明的技術(shù)方案及其構(gòu)思進(jìn)行相應(yīng)的等同改變或替換,而所有這些改變或替換,都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。
      權(quán)利要求
      1、一種兩點(diǎn)-對稱的直線生成方法,其特征在于
      根據(jù)直線始端像素點(diǎn)一次生成直線始端側(cè)的兩個后趨像素點(diǎn),其中,距離所述始端像素點(diǎn)較遠(yuǎn)的后趨點(diǎn)為始端側(cè)第一后趨像素點(diǎn),所述始端像素點(diǎn)與所述始端側(cè)第一后趨像素點(diǎn)之間的后趨像素點(diǎn)為始端側(cè)第二后趨像素點(diǎn);
      按照同趨規(guī)則,根據(jù)直線終端像素點(diǎn),一次生成直線終端側(cè)的兩個后趨像素點(diǎn),其中,距離所述終端像素點(diǎn)較遠(yuǎn)的后趨點(diǎn)為終端側(cè)第一后趨像素點(diǎn),所述終端像素點(diǎn)與所述終端側(cè)第一后趨像素點(diǎn)之間的后趨像素點(diǎn)為終端側(cè)第二后趨像素點(diǎn);
      將所述始端側(cè)第一后趨像素點(diǎn)作為始端側(cè)當(dāng)前的始端像素點(diǎn),將所述終端側(cè)第一后趨像素點(diǎn)作為終端側(cè)當(dāng)前的終端像素點(diǎn),以2個像素單位為步進(jìn)長度,迭代生成所述直線剩余的像素點(diǎn)。
      2、如權(quán)利要求1所述的直線生成方法,其特征在于
      根據(jù)所述始端像素點(diǎn)一次生成所述始端側(cè)的兩個后趨像素點(diǎn),包括將坐標(biāo)空間的四個象限按照斜率2或1/2劃分為16個卦限,通過模式判斷一次生成所述始端側(cè)的兩個后趨像素點(diǎn)。
      3、如權(quán)利要求2所述的直線生成方法,其特征在于
      所述模式判斷所采用的模式種類在每個卦限內(nèi)是確定的。
      4、如權(quán)利要求3所述的直線生成方法,其特征在于
      所述模式種類在每個卦限內(nèi)為3種。
      5、如權(quán)利要求1所述的直線生成方法,其特征在于
      如果所述直線在除去所述直線始端像素點(diǎn)和所述直線終端像素點(diǎn)后,剩余的像素點(diǎn)數(shù)量用4整除后還有余數(shù),則以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,生成所述直線上與所述余數(shù)對應(yīng)的所述始端側(cè)與所述終端側(cè)中間的接點(diǎn)。
      6、如權(quán)利要求5所述的直線生成方法,其特征在于
      所述余數(shù)為1,對應(yīng)的所述接點(diǎn)為1個,以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,生成所述接點(diǎn);
      所述余數(shù)為2,對應(yīng)的所述接點(diǎn)為2個,以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,首先生成所述接點(diǎn)中距離所述當(dāng)前的始端像素點(diǎn)較近的那1個接點(diǎn),然后再生成剩余的那1個接點(diǎn);及
      所述余數(shù)為3,對應(yīng)的所述接點(diǎn)為3個,以所述始端側(cè)最后一次迭代生成的第一后趨像素點(diǎn)作為當(dāng)前的始端像素點(diǎn),根據(jù)所述直線的斜率,首先生成所述接點(diǎn)中距離所述當(dāng)前的始端像素點(diǎn)最近的第1個接點(diǎn),然后再生成距離所述當(dāng)前的始端像素點(diǎn)次近的第2個接點(diǎn),最后將所述第1個接點(diǎn)對稱到所述終端側(cè),得到所述接點(diǎn)中剩余的那個接點(diǎn)。
      全文摘要
      本發(fā)明公開了一種兩點(diǎn)-對稱的直線生成方法,旨在提高圖形系統(tǒng)中直線的生成效率,以2個像素單位為步進(jìn)長度,在直線的始端根據(jù)當(dāng)前起始點(diǎn)一次生成兩個后趨像素點(diǎn),再按照同趨規(guī)則,在終端側(cè)也得到兩個后趨像素點(diǎn),一次迭代運(yùn)算就可以得到直線上的4個像素點(diǎn),有效提高了直線的生成效率,適用于整個計(jì)算機(jī)圖形學(xué)領(lǐng)域。
      文檔編號G06T11/20GK101408987SQ200710164029
      公開日2009年4月15日 申請日期2007年10月12日 優(yōu)先權(quán)日2007年10月12日
      發(fā)明者黨茂昌 申請人:中興通訊股份有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
      1