本發(fā)明屬于圖形處理技術(shù)領(lǐng)域,尤其涉及一種多邊形的矩形窗口裁剪系統(tǒng)。
背景技術(shù):
在矢量圖形渲染系統(tǒng)中,所要顯示的圖形往往比窗口大很多,因此為了減少不必要的繪制,需要使用顯示窗口來(lái)裁剪矢量圖形,從而提高顯示的效率。二維裁剪是圖形系統(tǒng)中最為基礎(chǔ)、最為常用的操作之一,而所有的二維圖形的裁剪都可以歸結(jié)于多變形的裁剪,傳統(tǒng)的裁剪算法主要有sutherland-hodgman算法和liang-barsky算法。其本身都是作為直線裁剪算法,多邊形則裁剪則是通過(guò)窗口的邊所在直線逐邊地裁剪,對(duì)于矩形窗口來(lái)說(shuō)也就是需要四次遍歷被裁剪多邊形。cohen-sutherland直線裁剪算法的核心是把所有直線的端點(diǎn)均分配一個(gè)表示其相對(duì)位置的4位二進(jìn)制的區(qū)域碼,從而迅速判斷直線和位置關(guān)系而舍棄在窗口外的線段,傳統(tǒng)的多邊形裁剪方法之所以效率比較低,其中最主要的原因就是依次需要利用窗口的每條邊對(duì)多邊形進(jìn)行裁剪,現(xiàn)有技術(shù)存在大量重復(fù)計(jì)算、算法復(fù)雜且效率低的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種多邊形的矩形窗口裁剪系統(tǒng),以解決上述背景技術(shù)中大量重復(fù)計(jì)算、算法復(fù)雜且效率低的問(wèn)題。
本發(fā)明所解決的技術(shù)問(wèn)題采用以下技術(shù)方案來(lái)實(shí)現(xiàn):一種多邊形的矩形窗口裁剪系統(tǒng),其特征在于,包括:輸入部、處理中心和存儲(chǔ)部;
所述處理中心用于:
對(duì)第一頂點(diǎn)和第二頂點(diǎn)分別獲取區(qū)域碼,對(duì)第一頂點(diǎn)的區(qū)域碼和第二頂點(diǎn)的區(qū)域碼進(jìn)行異或操作和或操作;
若異或操作的結(jié)果為零,則判斷第二頂點(diǎn)的區(qū)域碼是否為零,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段在窗口外并不記錄第二頂點(diǎn),若第二頂點(diǎn)的區(qū)域碼不為零,則確定輸入的線段在窗口內(nèi)并將第二頂點(diǎn)順序記錄于結(jié)果集;
若異或操作的結(jié)果不為零,則判斷第二頂點(diǎn)的區(qū)域碼是否為零,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段和矩形窗口的線段相交形成窗口交點(diǎn)并將窗口交點(diǎn)記錄于順序記錄于結(jié)果集,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段和兩條矩形窗口的線段相交形成第一交點(diǎn)和第二交點(diǎn),將所述的第一交點(diǎn)記錄于結(jié)果集,所述第二交點(diǎn)不記錄于結(jié)果集并將第一交點(diǎn)和第二頂點(diǎn)確定為一條擬制線段和矩形窗口的線段相交形成擬制交點(diǎn)并將擬制交點(diǎn)順序記錄于結(jié)果集。
進(jìn)一步,所述獲取兩個(gè)端點(diǎn)區(qū)域碼為經(jīng)計(jì)算獲取兩個(gè)端點(diǎn)區(qū)域碼或經(jīng)查表獲取兩個(gè)端點(diǎn)區(qū)域碼。
進(jìn)一步,所述輸入部用于輸入多邊形任意一條線段的第一頂點(diǎn)和第二頂點(diǎn)。
進(jìn)一步,所述存儲(chǔ)部用于存儲(chǔ)結(jié)果集。
本發(fā)明的有益效果為:
1本專利采用包括輸入部、處理中心和存儲(chǔ)部,所述處理中心用于:對(duì)第一頂點(diǎn)和第二頂點(diǎn)分別獲取區(qū)域碼,對(duì)第一頂點(diǎn)的區(qū)域碼和第二頂點(diǎn)的區(qū)域碼進(jìn)行異或操作和或操作,若異或操作的結(jié)果為零,則判斷第二頂點(diǎn)的區(qū)域碼是否為零,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段在窗口外并不記錄第二頂點(diǎn),若第二頂點(diǎn)的區(qū)域碼不為零,則確定輸入的線段在窗口內(nèi)并將第二頂點(diǎn)順序記錄于結(jié)果集,若異或操作的結(jié)果不為零,則判斷第二頂點(diǎn)的區(qū)域碼是否為零,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段和矩形窗口的線段相交形成窗口交點(diǎn)并將窗口交點(diǎn)記錄于順序記錄于結(jié)果集,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段和兩條矩形窗口的線段相交形成第一交點(diǎn)和第二交點(diǎn),將所述的第一交點(diǎn)記錄于結(jié)果集,所述第二交點(diǎn)不記錄于結(jié)果集并將第一交點(diǎn)和第二頂點(diǎn)確定為一條擬制線段和矩形窗口的線段相交形成擬制交點(diǎn)并將擬制交點(diǎn)順序記錄于結(jié)果集,由于能夠裁剪復(fù)雜的多邊形,并且可以保留頂點(diǎn)順序,最重要的是只需要一次遍歷多變形頂點(diǎn)序列,大大提高了算法效率。
2本專利二維向量的叉乘對(duì)頂點(diǎn)和直線關(guān)系進(jìn)行判別,在窗口完全在直線的一側(cè)的情況下不需要求交點(diǎn)。針對(duì)矩形窗口的特殊性,發(fā)明了一種多邊形的裁剪方法——基于矩形窗口的多邊形快速裁剪方法。該方法不僅能簡(jiǎn)單直觀高效,還具有良好的適應(yīng)性。
3本專利通過(guò)線段兩個(gè)端點(diǎn)的區(qū)域碼,迅速得到與窗口的位置關(guān)系,按照多邊形的順序添加交點(diǎn),頂點(diǎn)或者窗口頂點(diǎn),所有的操作一步完成,算法具有直觀高效的特點(diǎn)。
4、本專利應(yīng)用范圍廣泛,提高了用戶裁剪圖形時(shí)體驗(yàn)效果。
附圖說(shuō)明
圖1是本發(fā)明一種多邊形的矩形窗口裁剪系統(tǒng)的結(jié)構(gòu)圖;
圖2是本發(fā)明一種多邊形的矩形窗口裁剪系統(tǒng)的原理圖。
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步描述:
圖中:1-輸入部,2-處理中心,3-存儲(chǔ)部。
實(shí)施例:
本實(shí)施例包括:如圖1所示,一種多邊形的矩形窗口裁剪系統(tǒng),包括輸入部1、處理中心2和存儲(chǔ)部3;
所述處理中心2用于:
對(duì)第一頂點(diǎn)和第二頂點(diǎn)分別獲取區(qū)域碼,對(duì)第一頂點(diǎn)的區(qū)域碼和第二頂點(diǎn)的區(qū)域碼進(jìn)行異或操作和或操作;
若異或操作的結(jié)果為零,則判斷第二頂點(diǎn)的區(qū)域碼是否為零,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段在窗口外并不記錄第二頂點(diǎn),若第二頂點(diǎn)的區(qū)域碼不為零,則確定輸入的線段在窗口內(nèi)并將第二頂點(diǎn)順序記錄于結(jié)果集;
若異或操作的結(jié)果不為零,則判斷第二頂點(diǎn)的區(qū)域碼是否為零,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段和矩形窗口的線段相交形成窗口交點(diǎn)并將窗口交點(diǎn)記錄于順序記錄于結(jié)果集,若第二頂點(diǎn)的區(qū)域碼為零,則確定輸入的線段和兩條矩形窗口的線段相交形成第一交點(diǎn)和第二交點(diǎn),將所述的第一交點(diǎn)記錄于結(jié)果集,所述第二交點(diǎn)不記錄于結(jié)果集并將第一交點(diǎn)和第二頂點(diǎn)確定為一條擬制線段和矩形窗口的線段相交形成擬制交點(diǎn)并將擬制交點(diǎn)順序記錄于結(jié)果集。
由于能夠裁剪復(fù)雜的多邊形,并且可以保留頂點(diǎn)順序,最重要的是只需要一次遍歷多變形頂點(diǎn)序列,大大提高了算法效率。
進(jìn)一步,二維向量的叉乘對(duì)頂點(diǎn)和直線關(guān)系進(jìn)行判別,在窗口完全在直線的一側(cè)的情況下不需要求交點(diǎn)。針對(duì)矩形窗口的特殊性,發(fā)明了一種多邊形的裁剪方法——基于矩形窗口的多邊形快速裁剪方法。該方法不僅能簡(jiǎn)單直觀高效,還具有良好的適應(yīng)性。
所述獲取兩個(gè)端點(diǎn)區(qū)域碼為經(jīng)計(jì)算獲取兩個(gè)端點(diǎn)區(qū)域碼或經(jīng)查表獲取兩個(gè)端點(diǎn)區(qū)域碼。
所述輸入部1用于輸入多邊形任意一條線段的第一頂點(diǎn)和第二頂點(diǎn)。
所述存儲(chǔ)部3用于存儲(chǔ)結(jié)果集。
通過(guò)線段兩個(gè)端點(diǎn)的區(qū)域碼,迅速得到與窗口的位置關(guān)系,按照多邊形的順序添加交點(diǎn),頂點(diǎn)或者窗口頂點(diǎn),所有的操作一步完成,算法具有直觀高效的特點(diǎn)
工作原理:如圖1所示,本專利首先計(jì)算線段兩個(gè)端點(diǎn)的區(qū)域碼,對(duì)兩個(gè)區(qū)域碼進(jìn)行異或、或操作。異或的結(jié)果等于0表示線段在相同區(qū)域,此時(shí)可以直接添加或者丟棄該線段。異或的結(jié)果不等于0,則根據(jù)不同的值進(jìn)行分析,每一種值都對(duì)應(yīng)兩到種相似的情況,我們可以根據(jù)異或值判斷線段與窗口是否相交,以及與窗口的哪一條邊相交,減少了相交的運(yùn)算。如果異或的結(jié)果不為0,線段和窗口也沒(méi)有交點(diǎn),這時(shí)可看作直線繞過(guò)窗口的某一個(gè)頂點(diǎn),窗口頂點(diǎn)也可以看作線段的在窗口上的投影,因此添加窗口頂點(diǎn)到結(jié)果集中,因?yàn)閮纱翁砑酉嗤旤c(diǎn)是沒(méi)有意義的,所以為了精簡(jiǎn)結(jié)果,只需要添加一次。一次遍歷之后得到的結(jié)果可能包含在窗口邊界上重合而且方向相反的線段,這對(duì)圖形顯示來(lái)說(shuō)不會(huì)帶來(lái)什么問(wèn)題,我們也可以進(jìn)一步將裁剪結(jié)果拆分為多個(gè)簡(jiǎn)單直觀的圖形,但這樣做的前提是要記錄在窗口各條邊的每一個(gè)交點(diǎn)以及順序,同時(shí)還需要進(jìn)行路徑搜索,增加了計(jì)算量,因此在填充圖形的裁剪時(shí)不采用該方法,本發(fā)明解決了存在大量重復(fù)計(jì)算、算法復(fù)雜且效率低的問(wèn)題,具有提高了算法效率、良好的適應(yīng)性、直觀高效、提高了用戶裁剪圖形時(shí)體驗(yàn)效果的有益技術(shù)效果。
利用本發(fā)明的技術(shù)方案,或本領(lǐng)域的技術(shù)人員在本發(fā)明技術(shù)方案的啟發(fā)下,設(shè)計(jì)出類似的技術(shù)方案,而達(dá)到上述技術(shù)效果的,均是落入本發(fā)明的保護(hù)范圍。