本發(fā)明涉及多邊形相交面積計算領(lǐng)域,具體涉及一種基于GPU的任意多邊形相交面積計算方法。
背景技術(shù):
平面多邊形相交面積的應(yīng)用非常廣泛,在計算機圖形學(xué)、計算幾何學(xué)及計算流體力學(xué)等領(lǐng)域都需要計算相交多邊形共同覆蓋區(qū)域的面積,其內(nèi)容包含了相交測試和相交面積兩個部分,相交面積將確定多邊形相交的形狀和面積計算。
現(xiàn)有的多邊形相交面積計算方法一般是是由計算機的通用處理器(CPU)以串行處理方式來實現(xiàn)。近年來,在計算機動畫、虛擬現(xiàn)實等領(lǐng)域,為了表現(xiàn)更豐富的細(xì)節(jié),現(xiàn)有基于CPU的串行處理方法在多邊形相交面積計算應(yīng)用中已無法滿足快速實時的需求。
目前,GPU即圖形處理器,以其強大的運算能力在圖形處理方面得到了廣泛應(yīng)用,與CPU的串行處理方法不同,GPU的優(yōu)勢在于其并行處理機制,因此在處理速度方面優(yōu)勢明顯。但是,現(xiàn)有技術(shù)中,針對多邊形相交面積計算,尚缺乏基于GPU處理完成多邊形相交面積的工程實現(xiàn)方法。
另外,從相交多邊形的形狀來看,現(xiàn)有的多邊形相交面積計算方法大多針對凸多邊形的相交面積進行計算,而對于凹多邊形的相交,多數(shù)計算方法需要先對凹多邊形進行三角化或凸化細(xì)分。由于細(xì)分工作本身較復(fù)雜且會帶來更多的邊做相交測試,這大大增加了計算量,尤其是對于含有較多凹點或交點數(shù)量較多的多邊形更是如此。因此,現(xiàn)有技術(shù)在進行凹多邊形相交面積計算時耗時多、工作量大、效率低,與凸多邊形相交面積計算相比,對凹多邊形相交面積的計算顯得力不從心。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是針對上述現(xiàn)有技術(shù)的不足,而提供一種基于GPU的任意多邊形相交面積計算方法,既提高多邊形相交面積計算的處理速度,又可以不受多邊形形狀的限制,可以針對任意形狀和數(shù)量的多邊形相交而計算相交面積。
為解決上述技術(shù)問題,本發(fā)明采用的一個技術(shù)方案是:一種基于GPU的任意多邊形相交面積計算方法,該方法包括如下步驟:
(1)在柵格場中確定一個柵格區(qū)域,并對所述該柵格區(qū)域初始化,將所述柵格區(qū)域內(nèi)各柵格對應(yīng)的位置標(biāo)示符的值均預(yù)設(shè)為初始值a,a≥0;
(2)在所述柵格區(qū)域內(nèi)生成第一個多邊形柵格圖像,將以頂點坐標(biāo)表示的第一個多邊形對應(yīng)轉(zhuǎn)換為由GPU處理的以柵格表示的第一個多邊形柵格圖像,若所述柵格區(qū)域內(nèi)任一柵格位于所述第一個多邊形柵格圖像的內(nèi)部或邊線上,則將所述柵格對應(yīng)的位置標(biāo)示符的值累加b變?yōu)閍+b,b≥1,否則,若所述柵格區(qū)域內(nèi)任一柵格位于所述第一個多邊形柵格圖像的外部,則所述柵格對應(yīng)的位置標(biāo)示符的值不變;
(3)繼續(xù)生成第2~n個多邊形柵格圖像,按照步驟(2)所述方法順次在所述柵格區(qū)域內(nèi)繼續(xù)生成其余n-1個多邊形柵格圖像,n≥2,其中,在生成每一個當(dāng)前多邊形柵格圖像時,若所述柵格區(qū)域內(nèi)任一柵格位于所述當(dāng)前多邊形柵格圖像的內(nèi)部或邊線上,則將所述柵格對應(yīng)的位置標(biāo)示符的值累加b,否則,若所述柵格區(qū)域內(nèi)任一柵格位于所述當(dāng)前多邊形柵格圖像的外部,則所述柵格對應(yīng)的位置標(biāo)示符的值不變;
(4)統(tǒng)計n個多邊形柵格圖像的相交柵格數(shù)count,統(tǒng)計所述柵格區(qū)域內(nèi)位置標(biāo)示符的值為a+nb的柵格的數(shù)目,該數(shù)目即為n個多邊形柵格圖像的相交柵格數(shù)count;
(5)計算n個多邊形的相交面積,將所述的相交柵格數(shù)count除以所述柵格區(qū)域的分辨率,然后再乘以柵格區(qū)域的面積,即得到所述n個多邊形的相交面積S。
在本發(fā)明另一個實施例中,步驟(1)中的所述柵格區(qū)域為所述的整個柵格場,則步驟(4)中統(tǒng)計n個多邊形柵格圖像相交柵格數(shù)的方法是:遍歷所述柵格場中的每一個柵格,確定每一個柵格對應(yīng)的位置標(biāo)示符的值,找到其中位置標(biāo)示符的值為a+nb的柵格,并計算這些柵格的數(shù)目。
在本發(fā)明另一個實施例中,步驟(1)中的所述柵格區(qū)域為所述的n個多邊形柵格圖像在所述柵格場中所占用的柵格圖幅,則步驟(4)中統(tǒng)計n個多邊形柵格圖像相交柵格數(shù)的方法是:遍歷所述柵格圖幅中的每一個柵格,找到其中位置標(biāo)示符的值為a+nb的柵格,并計算這些柵格的數(shù)目。
在本發(fā)明另一個實施例中,確定所述n個多邊形柵格圖像在所述柵格場中所占用的柵格圖幅是由GPU處理完成的,具體方法是:確定所述n個多邊形在X方向坐標(biāo)的最大值Vxmax和最小值Vxmin,以及所述n個多邊形在Y方向坐標(biāo)的最大值Vymax和最小值Vymin,則由Vxmax、Vxmin和Vymax、Vymin確定的柵格范圍即為所述的柵格圖幅;且所述n個多邊形在X方向坐標(biāo)的最小值Vxmin柵格化后位于所述柵格圖幅從左至右的第一列,最大值Vxmax柵格化后位于所述柵格圖幅從左至右的最后一列,所述n個多邊形在Y方向坐標(biāo)的最小值Vymin柵格化后位于所述柵格圖幅從下至上的第一行,最大值Vymax柵格化后位于所述柵格圖幅從下至上的最后一行。
在本發(fā)明另一個實施例中,所述步驟(4)中統(tǒng)計所述柵格區(qū)域內(nèi)位置標(biāo)示符的值為a+nb的柵格的數(shù)目由GPU處理完成,或者由GPU通過軟件環(huán)境OpenGL中的像素讀取函數(shù)將所有要遍歷的柵格及其對應(yīng)的位置標(biāo)示符的值傳送到CPU后由CPU處理完成的。
在本發(fā)明另一個實施例中,GPU利用遮擋查詢方法統(tǒng)計所述柵格區(qū)域內(nèi)位置標(biāo)示符的值為a+nb的柵格的數(shù)目。
在本發(fā)明另一個實施例中,所述CPU為Inter Core(TM)i5-3337U處理器,所述GPU為NVIDIA GeForce GT 620M,操作系統(tǒng)為Microsoft Windows 7、軟件環(huán)境OpenGL為OpenGL 4.4.0。
在本發(fā)明另一個實施例中,所述步驟(2)和(3)中將以頂點坐標(biāo)表示的多邊形對應(yīng)轉(zhuǎn)換為由GPU處理的以柵格表示的多邊形柵格圖像的方法為:在OpenGL軟件環(huán)境中構(gòu)建轉(zhuǎn)換處理函數(shù),向所述轉(zhuǎn)換處理函數(shù)順次輸入所述多邊形所有順序排列的頂點坐標(biāo),所述轉(zhuǎn)換處理函數(shù)輸出的即為所述各頂點坐標(biāo)按照輸入順序首尾相連構(gòu)成的所述以柵格表示的多邊形柵格圖像。
在本發(fā)明另一個實施例中,所述柵格場的分辨率包括256×256、512×512、1024×1024、2048×2048。
在本發(fā)明另一個實施例中,所述初始值a=0,b=1。
本發(fā)明的有益效果是:本發(fā)明基于GPU的任意多邊形相交面積計算方法是一種新穎高效的多邊形相交面積計算方法,該方法借助于GPU來實現(xiàn)任意多邊形的柵格化,將以頂點坐標(biāo)表示的多邊形轉(zhuǎn)換為以柵格表示的多邊形柵格圖像,同時根據(jù)圖像的相交情況對所有柵格的位置標(biāo)示符進行賦值、修正,再由CPU或者GPU來統(tǒng)計相交柵格的數(shù)目并計算相交面積。該方法的優(yōu)點如下:
(1)將多邊形柵格化,利用柵格數(shù)據(jù)進行處理,不受多邊形凹凸性的限制;另外,由于柵格數(shù)據(jù)是將幾何空間作為整體進行描述,它以規(guī)則的陣列來表示空間對象,數(shù)據(jù)直接記錄柵格的顯示特征,而所在位置則根據(jù)行列號轉(zhuǎn)換為相應(yīng)的坐標(biāo),不受空間對象形狀的影響,具體空間對象的復(fù)雜程度不影響數(shù)據(jù)量的大小,因此處理起來也更簡便;
(2)利用了GPU的并行特性,與借助于CPU的計算方法相比,大大提升了處理速度,并且原理簡單,實現(xiàn)方便。
(3)利用遮擋查詢方法進行避免了GPU與CPU之間的數(shù)據(jù)傳遞,進一步提升了執(zhí)行效率。
實驗結(jié)果表明,本發(fā)明的計算方法適用于任意復(fù)雜多邊形,很好的避免了傳統(tǒng)計算方法所遇到的奇異性問題(邊界問題),比如重疊邊、邊與邊交于邊的頂點等情形,從而具有較好的魯棒性。
附圖說明
圖1是本發(fā)明基于GPU的任意多邊形相交面積計算方法的流程圖;
圖2是本發(fā)明基于GPU的任意多邊形相交面積計算方法另一實施例中兩個多邊形柵格圖像相交實施例的示意圖;
圖3是本發(fā)明基于GPU的任意多邊形相交面積計算方法另一實施例中有“洞”多邊形示例圖。
具體實施方式
為了便于理解本發(fā)明,下面結(jié)合附圖和具體實施例,對本發(fā)明進行更詳細(xì)的說明。附圖中給出了本發(fā)明的較佳的實施例。但是,本發(fā)明可以以許多不同的形式來實現(xiàn),并不限于本說明書所描述的實施例。相反地,提供這些實施例的目的是使對本發(fā)明的公開內(nèi)容的理解更加透徹全面。
需要說明的是,除非另有定義,本說明書所使用的所有的技術(shù)和科學(xué)術(shù)語與屬于本發(fā)明的技術(shù)領(lǐng)域的技術(shù)人員通常理解的含義相同。在本發(fā)明的說明書中所使用的術(shù)語只是為了描述具體的實施例的目的,不是用于限制本發(fā)明。本說明書所使用的術(shù)語“和/或”包括一個或多個相關(guān)的所列項目的任意的和所有的組合。
如圖1所示為本發(fā)明提供的基于GPU的任意多邊形相交面積計算方法實施例一的流程圖。
首先,需要說明的是,圖1所示實施例是基于GPU處理實現(xiàn)對圖形圖像的處理,而GPU處理直接與圖形圖像的顯示場景密切相關(guān),因此本發(fā)明實施例相應(yīng)涉及到柵格、柵格場等概念。這里的柵格是指對圖形圖像進行數(shù)字化處理后的最小顯示單元,每一個柵格對應(yīng)一個顯示像素,眾多柵格以縱橫陣列形式所構(gòu)成的顯示區(qū)域稱之為柵格場,因此柵格場通常也是指顯示屏幕。例如,像素為248×248的顯示屏就對應(yīng)指有248×248個柵格的柵格場。
另外,本發(fā)明實施例的優(yōu)勢還在于柵格場是對柵格數(shù)據(jù)進行處理的基礎(chǔ),而柵格數(shù)據(jù)是一種面向空間的表示方法,柵格數(shù)據(jù)結(jié)構(gòu)要比矢量數(shù)據(jù)結(jié)構(gòu)(這里的矢量數(shù)據(jù)是一種面向?qū)嶓w的表示方法,它是以坐標(biāo)的形式來表示空間物體)更加適合計算機進行處理。柵格數(shù)據(jù)是將幾何空間作為整體進行描述,它以規(guī)則的陣列來表示空間對象,數(shù)據(jù)直接記錄柵格的顯示特征,而所在位置則根據(jù)行列號轉(zhuǎn)換為相應(yīng)的坐標(biāo),不受空間對象形狀的影響,空間對象的復(fù)雜程度不影響數(shù)據(jù)量的大小。而矢量數(shù)據(jù)結(jié)構(gòu)是通過記錄坐標(biāo)的方式盡可能精確地表示點、線和多邊形等具體的空間物體,但是物體越復(fù)雜,描述就越困難,數(shù)據(jù)量也隨之增大。因此,比較而言,柵格數(shù)據(jù)要比矢量數(shù)據(jù)結(jié)構(gòu)簡單得多,基于空間的幾何分析也相對容易。本發(fā)明實施例中,將以矢量數(shù)據(jù)表示的多邊形轉(zhuǎn)化為以柵格數(shù)據(jù)表示的多邊形柵格圖像的過程即為柵格化。
本實施例要利用GPU進行相交面積計算也是基于柵格數(shù)據(jù)實現(xiàn)的。
如圖1可知,該實施例的方法包括如下步驟:
步驟S1:在柵格場中確定一個柵格區(qū)域,并對該柵格區(qū)域初始化,即將柵格區(qū)域內(nèi)各柵格對應(yīng)的位置標(biāo)示符的值均預(yù)設(shè)為初始值a,a≥0。
這里,步驟S1的目的是完成對柵格場的初始化。如上所述,柵格場是指整個顯示區(qū)域或顯示屏幕,而在對圖形相交面積計算中,相交圖形在顯示屏幕上顯示并不一定占據(jù)整個屏幕,因此只需選定一個合理的區(qū)域即可,這個顯示區(qū)域?qū)嶋H上是由各個相交多邊形占有的顯示區(qū)域共同決定的,在該顯示區(qū)域內(nèi)能夠包括各個相交多邊形,同時這個顯示區(qū)域盡可能小,這樣有利于提高處理速度。這個顯示區(qū)域就是步驟S1中需要確定的柵格區(qū)域。
另外,步驟S1中柵格對應(yīng)的位置標(biāo)示符的含義是指在柵格場中的每一個柵格都對應(yīng)一個位置標(biāo)識符,該位置標(biāo)識符屬于一種柵格數(shù)據(jù)。例如,在一個有248×248個柵格的柵格場中,若將左下角頂點的第一個柵格對應(yīng)的位置標(biāo)識符表示為rct(0,0),其中第一個0表示橫向坐標(biāo),第二個0表示縱向坐標(biāo),因此臨近該頂點柵格的上方一個柵格的位置標(biāo)識符表示為rct(0,1),而臨近該頂點柵格的右方一個柵格的位置標(biāo)識符表示為rct(1,0),以此類推。對柵格對應(yīng)的位置標(biāo)示符進行賦值是為了表示該柵格的顯示特征,例如rct(0,0)=0可以表示該頂點柵格沒有顯示任何內(nèi)容,即空白顯示,而rct(0,0)=1可以表示該頂點柵格有顯示內(nèi)容。優(yōu)選的,在本發(fā)明實施例中我們可以規(guī)定若一個柵格位于一個多邊形柵格圖像所圍成的區(qū)域內(nèi)或者在該多邊形柵格圖像的邊線上,則該柵格的位置標(biāo)識符的值為1或者在原有值的基礎(chǔ)上加1,若該柵格位于該多邊形柵格圖像所圍成的區(qū)域外部(即不在該多邊形柵格圖像的內(nèi)部和邊線上),則該柵格的位置標(biāo)識符的值為0或者對原有值不做任何運算。
步驟S1中只是對確定的柵格區(qū)域內(nèi)各柵格對應(yīng)的位置標(biāo)示符的值進行了初始賦值,并且預(yù)設(shè)為初始值a,a≥0。優(yōu)選的,a=0。
進一步的,我們可以看出,對于步驟S1,需要確定一個合理的柵格區(qū)域,這個柵格區(qū)域既可以是整個柵格場,也可以是通過GPU根據(jù)待計算相交面積的所有多邊形所確定的柵格圖幅。這里,柵格圖幅為由待計算相交面積的所有這些多邊形經(jīng)過柵格化后在柵格場中所確定的柵格范圍。
為此,本發(fā)明實施例提供一個確定柵格圖幅的優(yōu)選實施例:首先,對于以矢量數(shù)據(jù)表示的這些多邊形的所有頂點的坐標(biāo),確定這些多邊形在X方向上坐標(biāo)的最大值和最小值分別為Vxmax、Vxmin,在Y方向上坐標(biāo)的最大值和最小值分別為Vymax、Vymin;然后,在這些相交多邊形柵格化過程中,X方向坐標(biāo)的最小值Vxmin柵格化后位于柵格圖幅從左至右的第一列,最大值Vxmax柵格化后位于柵格圖幅從左至右的最后一列,Y方向坐標(biāo)的最小值Vymin柵格化后位于柵格圖幅從下至上的第一行,最大值Vymax柵格化后位于柵格圖幅從下至上的最后一行。
對于該柵格圖幅的面積,則為(Vxmax-Vxmin)x(Vymax-Vymin)。
圖1中,完成步驟S1后進入步驟S2:對計算任意多邊形相交面積的第一個多邊形柵格化,在柵格區(qū)域內(nèi)中生成第一個多邊形柵格圖像,將以頂點坐標(biāo)表示的第一個多邊形轉(zhuǎn)換為由GPU處理的以柵格表示的第一個多邊形柵格圖像,并修正該多邊形柵格圖像對應(yīng)各柵格的位置標(biāo)示符的值,若該柵格區(qū)域內(nèi)任一柵格位于第一個多邊形柵格圖像的內(nèi)部或邊線上,則將該柵格對應(yīng)的位置標(biāo)示符的值在初始值a的基礎(chǔ)上進行累加操作變?yōu)閍+b,b≥1;否則,若該柵格區(qū)域內(nèi)任一柵格位于第一個多邊形柵格圖像的外部,則該柵格對應(yīng)的位置標(biāo)示符的值不變。
由于本發(fā)明采用逐一轉(zhuǎn)化和賦值的方式對待相交多邊形進行柵格化處理,那么首先就需要對待相交的第一個多邊形柵格化,將以頂點坐標(biāo)表示的第一個多邊形轉(zhuǎn)換為由GPU處理的以柵格表示的第一個多邊形柵格圖像。步驟S2開始對第一個相交多邊形進行處理,包含兩個過程,第一個過程是柵格化的過程,即以頂點坐標(biāo)表示的第一個多邊形轉(zhuǎn)化為柵格數(shù)據(jù)表示的第一個多邊形柵格圖像,這里,頂點坐標(biāo)屬于一種矢量數(shù)據(jù),而柵格數(shù)據(jù)是指柵格顯示的像素特征數(shù)據(jù),比如由灰度、亮度、色彩等特征數(shù)據(jù);第二個過程是柵格的位置標(biāo)示符賦值的過程,主要是針對第一個多邊形柵格圖像的內(nèi)部(包括邊線)和外部加以區(qū)分,在其內(nèi)部的柵格對應(yīng)的位置標(biāo)示符進行累加操作而改變這些位置標(biāo)示符的值,在其外部的柵格對應(yīng)的位置標(biāo)示符不進行任何操作而保持另外這些位置標(biāo)示符的值不變。
這里,第一個柵格化的過程是由GPU處理完成的,實際應(yīng)用中可以通過圖形圖像開發(fā)軟件環(huán)境OpenGL中的glBegin(GL_POLYGON)、glEnd()專用函數(shù)來實現(xiàn),其過程是通過這些專用函數(shù)將第一個多邊形的頂點坐標(biāo)順次輸入,即在GPU處理函數(shù)中,順次輸入多邊形所有順序排列的頂點坐標(biāo),各頂點坐標(biāo)按照輸入順序(順時針或者逆時針)首尾相連即構(gòu)成以柵格表示的多邊形柵格圖像。優(yōu)選的,這里的多邊形是指由同一平面上不同的點首尾順次連接,任一個頂點都在邊上,且任意不相鄰的兩條邊不相交所構(gòu)成的空間圖形,因此包括了凸多邊形和凹多邊形。這樣,經(jīng)過柵格化之后,第一個多邊形就轉(zhuǎn)化為柵格圖像,即第一個多邊形對應(yīng)的第一個多邊形柵格圖像。
優(yōu)選的,步驟S2中累加操作值b為1,當(dāng)步驟S1中的a值為0時,則經(jīng)過步驟S2之后,在第一個多邊形柵格圖像內(nèi)部(包括邊線)的所有柵格對應(yīng)的位置標(biāo)示符的值為1,而在第一個多邊形柵格圖像外部的柵格對應(yīng)的位置標(biāo)示符的值為0。
以下一段處理程序示例是在OpenGL軟件開發(fā)環(huán)境下實現(xiàn)對多邊形的柵格化處理:
glBegin(GL_POLYGON);
glVertex2d(pPoint1[0].x,pPoint1[0].y);
glVertex2d(pPoint1[1].x,pPoint1[1].y);
glVertex2d(pPoint1[2].x,pPoint1[2].y);
glVertex2d(pPoint1[3].x,pPoint1[3].y);
glEnd();
其中,glBegin(GL_POLYGON)表示開始柵格化處理,glVertex2d(pPoint1[0].x,pPoint1[0].y)至glVertex2d(pPoint1[3].x,pPoint1[3].y)表示順次輸入多邊形所有順序排列的頂點坐標(biāo),可見該示例的多邊形是有四個頂點的四邊形,glEnd()表示柵格化處理結(jié)束。
在OpenGL軟件開發(fā)環(huán)境下,通過上述處理程序示例即可完成對輸入的以頂點坐標(biāo)表示的多邊形轉(zhuǎn)換為由GPU處理的以柵格表示的多邊形柵格圖像,這已經(jīng)是柵格化的過程。此時,這個經(jīng)過轉(zhuǎn)化后的四邊形柵格圖像里面的每一個柵格此時對應(yīng)的位置標(biāo)示符都變?yōu)榱?(傳入之前為0)。然后,在后續(xù)步驟中可以繼續(xù)通過glBegin(GL_POLYGON)和glEnd()這樣的函數(shù)語句傳入下一個多邊形,如果存在相交,則相交部分的位置標(biāo)示符的值會不斷的累加。
圖1中,在步驟S2實現(xiàn)對第一個多邊形的處理之后,進入步驟S3完成后續(xù)對其他多邊形的處理:按照與步驟S2相類似的方法依次對其余n-1個多邊形柵格化,繼續(xù)生成第2~n個多邊形柵格圖像,n≥2,并在柵格化過程中修正每個多邊形柵格圖像對應(yīng)各柵格的位置標(biāo)示符的值;其中,在生成每一個當(dāng)前多邊形柵格圖像時,若柵格區(qū)域內(nèi)任一柵格位于當(dāng)前多邊形柵格圖像的內(nèi)部或邊線上,則將該柵格對應(yīng)的位置標(biāo)示符的值累加b,否則,若柵格區(qū)域內(nèi)任一柵格位于當(dāng)前多邊形柵格圖像的外部,則該柵格對應(yīng)的位置標(biāo)示符的值不變。
步驟S3是順次對輸入的每一個多邊形進行柵格化處理和位置標(biāo)示符的賦值處理,在步驟S2中已經(jīng)對第一個多邊形進行了處理,步驟S3是對后續(xù)的多邊形進行處理,其目的是要計算n個多邊形相交的面積,因此步驟S3主要是針對后續(xù)n-1個多邊形,并且,對其中每一個多邊形都是獨立處理的。按照這樣順次執(zhí)行的方式操作只需對柵格是否在當(dāng)前柵格圖像內(nèi)部(包括邊線)和外部作出判斷,若某一柵格在當(dāng)前柵格圖像內(nèi)部或邊線上,則對該柵格對應(yīng)的位置標(biāo)示符的值做一次累加,否則若該柵格在當(dāng)前柵格圖像的外部,則不做累加。這種判斷和累加只與當(dāng)前柵格圖像有關(guān),而與其它已經(jīng)柵格化的柵格圖像無關(guān)。當(dāng)正在處理其中某一個多邊形時,該多邊形對應(yīng)生成的多邊形柵格圖像即為當(dāng)前多邊形柵格圖像。
比如,在生成第2個多邊形柵格圖像時,如果某一柵格位于第2個多邊形柵格圖像的內(nèi)部或邊線上將該柵格對應(yīng)的位置標(biāo)示符的值做一次累加運算,即累加b,b優(yōu)選為1,否則,不做累加運算。至于之前該柵格是否在第1個多邊形柵格圖像內(nèi)部(包括邊線)還是外部,并不影響對第2個多變形柵格圖像的處理。因此,上述步驟S2和步驟S3相結(jié)合對多個多邊形順次處理的方法保證了對每一個多邊形柵格圖像處理的獨立性,同時也能保證最終對這n個多邊形相交面積的計算。
由上述過程可知,在該柵格區(qū)域內(nèi),如果某一個柵格沒有與任何一個多邊形柵格圖像相交,則其對應(yīng)的位置標(biāo)示符的值仍為初始值0,如果某一個柵格只位于任意一個多邊形柵格圖像的內(nèi)部或邊線上,則其對應(yīng)的位置標(biāo)示符的值為1,如果位于任意兩個多邊形柵格圖像的內(nèi)部或邊線上,則其對應(yīng)的位置標(biāo)示符的值為2,如果位于任意三個多邊形柵格圖像的內(nèi)部或邊線上,則其對應(yīng)的位置標(biāo)示符的值為3,……由此類推,如果某一個柵格位于n個多邊形柵格圖像的內(nèi)部或邊線上,則其對應(yīng)的位置標(biāo)示符的值為n。需要說明的是,由于本發(fā)明的目的是要計算n個多邊形的相交面積,那么只有位置標(biāo)示符的值為n的柵格才是我們要統(tǒng)計計算的。
本步驟的多邊形柵格化仍由GPU通過OpenGL中語句glBegin(GL_POLYGON)和glEnd()順序傳入對應(yīng)的多邊形坐標(biāo)頂點來實現(xiàn),如果存在相交,則相交部分柵格的位置標(biāo)示符的值會不斷的累加。
以圖2中兩個多邊形相交(即n為2)為例進行說明,如圖2所示,假定該圖中第一個輸入的是一個四邊形,第二個輸入的是五邊形,本實施例中所選的柵格區(qū)域為這兩個多邊形所確定的柵格圖幅。具體過程如下:
首先經(jīng)過步驟S1對柵格區(qū)域Screen1進行初始化,各個柵格的位置標(biāo)示符賦初始值0;
然后經(jīng)過步驟S2,在該柵格區(qū)域Screen1內(nèi)轉(zhuǎn)化生成的第一個多邊形柵格圖像T1,即在柵格區(qū)域Screen1內(nèi)傳入四邊形,通過上述步驟S2中程序示例的方式對該四邊形柵格化處理,同時將該柵格圖像T1內(nèi)部或邊線上的柵格進行一次累加操作,使其位置標(biāo)示符的值從初始值0變?yōu)?,而四邊形柵格圖像T1區(qū)域外的柵格的位置標(biāo)示符的值均為初始值0。
再經(jīng)過步驟S3,在該柵格區(qū)域Screen1內(nèi)轉(zhuǎn)化生成的第二個多邊形柵格圖像T2,即以同樣的方式在柵格區(qū)域Screen1內(nèi)傳入五邊形,在傳入該五邊形的過程中,對相關(guān)柵格的位置標(biāo)示符的值進行修正,對處于該五邊形柵格圖像T2的內(nèi)部或邊線上的柵格進行一次累加操作,由圖2可知進行累加操作的柵格分為兩部分,一部分是兩個圖像的相交部分,這部分柵格的位置標(biāo)示符的值經(jīng)過了兩次累加變?yōu)?,另一部分是未與四邊形柵格圖像T1相交的部分,這部分柵格的位置標(biāo)示符累加一次變?yōu)?,處于該五邊形柵格圖像T2區(qū)域外的柵格不做處理??梢钥闯觯瑬鸥馦1對應(yīng)的位置標(biāo)示符的值為2,表明該柵格M1的位置標(biāo)示符經(jīng)歷了兩次累加操作,而該柵格M1正好也是第一個多邊形柵格圖像T1和第二個多邊形柵格圖像T2相交的柵格。因此,通過柵格的位置標(biāo)示符的累加后的結(jié)果值可以判斷多邊形柵格圖像相交的情況,而且這種判斷方法實現(xiàn)簡單,也不受多邊形是凸多邊形或凹多邊形等形狀的限制,增強了該方法的應(yīng)用的魯棒性。
通過以上三個步驟完成了對多邊形柵格圖像相交的柵格的確定,在此基礎(chǔ)上進一步確定相交的面積計算。
將所有多邊形柵格化處理以后,進入步驟S4:統(tǒng)計n個多邊形柵格圖像的相交柵格數(shù)count,在柵格區(qū)域內(nèi),統(tǒng)計位置標(biāo)示符的值為a+nb的柵格的數(shù)目,該數(shù)目即為n個多邊形柵格圖像的相交柵格數(shù)count。
通過步驟S2、S3對n個多邊形柵格化并對柵格區(qū)域內(nèi)的所有柵格賦值、修正以后,計算n個多邊形的相交面積S就轉(zhuǎn)化為計算n個多邊形柵格圖像相交柵格的總面積。這個相交柵格總面積的值為單個柵格的面積與相交柵格數(shù)的乘積,單個柵格的面積是柵格區(qū)域的總面積與對應(yīng)總柵格數(shù)(分辨率)的比值,由于柵格區(qū)域的總面積、對應(yīng)總柵格數(shù)均為已知量,那么計算n個多邊形的相交面積S最終就轉(zhuǎn)化為計算n個多邊形柵格圖像的相交柵格數(shù)count。
計算n個多邊形柵格圖像的相交柵格數(shù)count的過程如下:在GPU中將所有多邊形都柵格化形成對應(yīng)的柵格圖像以后,由GPU通過OpenGL中的glReadPixels函數(shù)將柵格圖幅中所有要遍歷的柵格及其對應(yīng)的位置標(biāo)示符的值傳送給CPU,再由CPU來統(tǒng)計該柵格圖幅中位置標(biāo)示符為a+nb的柵格的數(shù)目count。
本實施例的glReadPixels函數(shù)是在OpenGL軟件開發(fā)環(huán)境下用來對位置標(biāo)示符的值為n的柵格數(shù)目進行統(tǒng)計的函數(shù),在應(yīng)用該函數(shù)時,可以定義一個隨機數(shù)組result,用來存取柵格的位置標(biāo)示符的值,再利用glReadBuffer函數(shù)指定一個要讀取的緩存區(qū),該緩存區(qū)為GPU的緩存區(qū),且該緩存區(qū)中已保存有所要讀取的柵格及其對應(yīng)的位置標(biāo)示符的值。本實施例通過glReadPixels函數(shù)從GPU的緩沖區(qū)中把result值讀出到CPU中,統(tǒng)計等于n的個數(shù)。這個函數(shù)以及其OpenGL都是本領(lǐng)域技術(shù)人員的公知技術(shù),這里就不再贅述了。
另外,由于柵格區(qū)域有兩種選擇方式,那么對應(yīng)的統(tǒng)計n個多邊形柵格圖像相交柵格數(shù)也有兩種方式:
第一種:當(dāng)柵格區(qū)域為整個柵格場時,統(tǒng)計n個多邊形柵格圖像相交柵格數(shù)的方法為:遍歷柵格場中的每一個柵格,確定每一個柵格對應(yīng)的位置標(biāo)示符的值,找到其中位置標(biāo)示符的值為n的柵格,并計算這些位置標(biāo)示符的值為n的柵格的數(shù)目;
第二種:當(dāng)柵格區(qū)域是在柵格場中根據(jù)n個多邊形柵格圖像確定的柵格圖幅時,統(tǒng)計n個多邊形柵格圖像相交柵格數(shù)的方法為:遍歷該柵格圖幅中的每一個柵格,找到其中位置標(biāo)示符的值為n的柵格,并計算這些柵格的數(shù)目。
對于第一種方式,由于需要遍歷整個柵格場的所有柵格,柵格數(shù)目非常龐大,而第二種方式柵格圖幅比柵格場小的多,其柵格數(shù)目也遠(yuǎn)遠(yuǎn)小于第一種方式的柵格場,那么第二種方式所需要的時間就比第一種方式的時間短的多,效率也更高。因此,本實施例優(yōu)選第二種方式。
n個多邊形柵格圖像的相交柵格數(shù)統(tǒng)計出來以后,就進入步驟S5,計算n個多邊形的相交面積,將這n個多邊形柵格圖像的相交柵格數(shù)count除以柵格區(qū)域的分辨率RES,然后再乘以柵格區(qū)域的面積SArea,即得到n個多邊形的相交面積S。
通過步驟S4得到n個多邊形柵格圖像相交柵格的數(shù)目count以后,結(jié)合柵格區(qū)域的總面積和柵格區(qū)域的分辨率RES,就可以計算這n個多邊形柵格圖像相交柵格的總面積了,具體計算公式如下:
本發(fā)明基于GPU的任意多邊形相交面積計算方法的基本思想源于蒙特卡羅積分,將以頂點表示的多邊形表示為以柵格表示的多邊形柵格圖像,整個圖像處理過程在GPU中實現(xiàn),原理更簡單,效率更高,而且不對多邊形的凹凸性做任何假設(shè),對于凹多邊形也可以處理,適用于任意可光柵化的幾何圖元;另外,該方法利用GPU的并行特性,與借助于CPU的計算方法相比,大大提升了處理速度,并且原理簡單,實現(xiàn)方便。
另外,由于本發(fā)明基于GPU的任意多邊形相交面積計算方法在統(tǒng)計相交柵格的數(shù)目時需要從GPU中將數(shù)據(jù)讀回CPU,這是比較耗時的,會造成CPU和GPU之間的通信延遲。因此,為進一步在處理大數(shù)據(jù)量多邊形時實現(xiàn)加速,本發(fā)明對實施例一提供的計算方法進行優(yōu)化,提供了實施例二的第二種優(yōu)化的計算方法GPU Rasterization with glquery,利用遮擋查詢技術(shù)來避免這一時間消耗,根據(jù)增量水平線原理,利用模板緩沖區(qū)進行重疊測試,并采用查詢列表的方式避免CPU和GPU互相等待造成的延時。
第二種優(yōu)化的計算方法與第一種方法的區(qū)別僅在于第一種方法是由CPU統(tǒng)計n個多邊形柵格圖像相交柵格數(shù),而第二種方法是由GPU利用遮擋查詢統(tǒng)計n個多邊形柵格圖像相交柵格數(shù)count,GPU遮擋查詢方法是在OpenGL軟件開發(fā)環(huán)境下利用ARB_occlusion_query來實現(xiàn)的,其具體過程如下:
在OPENGL1.5及后續(xù)版本以及OpenGL ES 3.0中,ARB_occlusion_query擴展執(zhí)行GPU遮擋查詢的命令,它的查詢過程就是由GPU來確定最終在屏幕上可見像素的數(shù)量。由于像素在流水線中需要經(jīng)過各種檢驗,如alpha測試、模板測試和深度測試等(這些測試都是本領(lǐng)域的常規(guī)技術(shù),這里不再贅述),遮擋查詢就是將最終通過上述測試的像素的數(shù)量進行計數(shù),本實施例所要統(tǒng)計的為位置標(biāo)示符的值為n的柵格(即像素)的數(shù)目,也就是說這里的“通過上述測試的像素”即為“位置標(biāo)示符的值為n的柵格”。本實施例中GPU直接通過ARB_occlusion_query調(diào)用glGetQueryObjectuiv函數(shù)統(tǒng)計位置標(biāo)示符等于n的柵格數(shù),解決了統(tǒng)計相交柵格數(shù)時從GPU讀數(shù)據(jù)到CPU需要延遲時間的問題。
這兩種方法在面積精度上一樣,但第二種實施例的方法時間效率卻比第一種有顯著提高,但該方法有應(yīng)用局限性,就是必須在OPENGL1.5及后續(xù)版本以及OpenGL ES 3.0中,才能通過ARB_occlusion_query擴展執(zhí)行GPU遮擋查詢的命令,只有在這些版本上才能調(diào)用glGetQueryObjectuiv函數(shù),如果軟件版本達(dá)不到,該方法就不可用,此時可根據(jù)精度的容忍范圍選擇第一種實施例的方法。
本發(fā)明提供了兩種基于GPU的任意多邊形相交面積計算方法,都是將多邊形柵格化,利用柵格數(shù)據(jù)進行處理,不受多邊形凹凸性的限制;其次,該方法利用了GPU的并行特性,與借助于CPU的計算方法相比,大大提升了處理速度,并且原理簡單,實現(xiàn)方便;另外,第二種方法采用遮擋查詢技術(shù)對相交柵格數(shù)進行統(tǒng)計,避免從GPU讀取數(shù)據(jù)時CPU和GPU互相等待造成的延時,更進一步提高了計算效率。
下面通過實驗來驗證本發(fā)明計算方法的優(yōu)越性,以下為實驗驗證過程:
實驗條件:使用C++與GLSL語言,在Microsoft Windows 7操作系統(tǒng),OpenGL 4.4.0上實現(xiàn)本發(fā)明的計算方法,實驗環(huán)境用計算機的CPU采用Core(TM)i5-3337U,4G內(nèi)存,GPU為NVIDIA GeForce GT 620M。
實驗1給出三個模型:
模型1:隨機產(chǎn)生的兩個簡單多邊形P1和P2,隨機選取的這兩個多邊形的各個定點在平面直角坐標(biāo)為:P1={(4,4),(11,3),(12,6),(9,8)},P2={(11,3),(16,3),(18,8),(14,12),(9,8)},該模型通過兩個常規(guī)的多邊形驗證本發(fā)明計算方法的正確性。
模型2:選取兩個有“洞”的復(fù)雜多邊形,這里所說的有洞的多邊形是指類似于圖3(該圖為一個簡單的單洞多邊形示例)的多邊形,這樣的多邊形一般可以表示為一個外環(huán)和至少一個內(nèi)環(huán),該模型用于證明本發(fā)明的計算方法既可以針對凸多邊形,也能對凹多邊形進行處理。
模型3:選取兩個頂點數(shù)較多的凸多邊形,一個多邊形有800個頂點,另一個多邊形有358個頂點。該模型用于證明本發(fā)明的計算方法對于具有頂點數(shù)較多(大數(shù)據(jù)量)的任意多邊形具有較好的處理效果。
表1,表2和表3分別給出了上述三個模型在本發(fā)明兩種計算方法下分別計算相交面積的精度及時間。
實驗2是通過對不同數(shù)據(jù)規(guī)模的三角形進行相交測試來驗證本發(fā)明第二種計算方法的優(yōu)越效果。
表1模型1實驗結(jié)果
表2模型2實驗結(jié)果
表3模型3實驗結(jié)果
表4實驗2模型參數(shù)及實驗結(jié)果
以下以模型1為例,進行誤差率分析和執(zhí)行效率對比分析,具體分析如下:
誤差率分析:由表1可知,在256×256分辨率下,本發(fā)明的兩種計算方法誤差率都為0.45%。隨著分辨率的提高,誤差值越來越小,在512×512分辨率下,兩種計算方法的誤差率都僅為0.11%;在1024×1024分辨率下,兩種計算方法的誤差率都僅為0.05%,如此數(shù)量級別的舍入誤差在很多工程和一些大型軟件中都是可接受的。
執(zhí)行效率對比:由表1可知,在256×256分辨率下,本發(fā)明第一種計算方法的執(zhí)行時間為0.004s,第二種計算方法的執(zhí)行時間也僅為0.001s;當(dāng)數(shù)量級不斷增加,時間雖然有增加,但是增加的幅度比較小,在512×512分辨率下,第一種計算方法的執(zhí)行時間為0.012s,第二種計算方法的執(zhí)行時間僅為0.002s;當(dāng)數(shù)量級增加了3倍(1024×1024)時,第一種計算方法為0.032s,第二種計算方法還是僅有0.002s。而現(xiàn)有采用CPU的計算方法在分辨率以數(shù)量級方式增加時,其執(zhí)行時間一般會呈幾何倍數(shù)增加。由此表可知,在分辨率以數(shù)量級方式增加時,第一種計算方法的效率比現(xiàn)有計算方法提升百倍,第一種計算方法的效率提升千倍,數(shù)據(jù)量越大,加速效果越明顯。
表2和表3分別是模型2、模型3在本發(fā)明的兩種計算方法下分別計算相交面積的精度及時間對比,與模型1類似,這里就不再進行詳細(xì)的數(shù)據(jù)對比說明。
另外,從表3可知,對于頂點數(shù)較多的多邊形,本發(fā)明的第一種計算方法在1024×1024分辨率下處理此類模型僅需0.035s,第二種計算方法僅為0.007s。
從表4可知,當(dāng)三角形的數(shù)量從716、2400直至增加到18363時,隨著分辨率的不斷提高,本發(fā)明的計算方法時間雖然也有所增加,但是幾萬個面片在2048×2048分辨率下,方法的執(zhí)行時間只需要3秒左右。
本發(fā)明的兩種計算方法都不受多邊形性質(zhì)影響,可適用于多邊形數(shù)量龐大且任意復(fù)雜的多邊形,但是第一種計算方法中由于CPU和GPU之間的通信延遲會對計算時間有一定的影響,第二種計算方法避免了CPU和GPU之間的通信延遲卻受限于軟件運行環(huán)境,可根據(jù)實際情況選擇使用。
本發(fā)明提出的基于GPU的任意多邊形相交面積計算方法,利用了圖像柵格化思想,計算更為方便快速;另外,在計算方法中引入了遮擋查詢法,更方便高效,面積誤差在工程上也是可以接受的。實驗結(jié)果表明,本發(fā)明的計算方法適用于任意復(fù)雜多邊形,很好的避免了傳統(tǒng)計算方法所遇到的奇異性問題(邊界問題),比如重疊邊、邊與邊交于邊的頂點等情形,從而具有較好的魯棒性。
以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均包括在本發(fā)明的專利保護范圍內(nèi)。