本發(fā)明涉及計算機(jī)圖形圖像處理面積計算領(lǐng)域,具體涉及一種基于概率統(tǒng)計的任意多邊形相交面積計算方法。
背景技術(shù):
平面多邊形相交面積的應(yīng)用非常廣泛,在計算機(jī)圖形學(xué)、計算幾何學(xué)及計算流體力學(xué)等領(lǐng)域都需要計算相交多邊形共同覆蓋區(qū)域的面積。
現(xiàn)有的多邊形相交面積計算方法一般是是由計算機(jī)的通用處理器(CPU)以串行處理方式來實現(xiàn)。近年來,在計算機(jī)動畫、虛擬現(xiàn)實等領(lǐng)域,為了表現(xiàn)更豐富的細(xì)節(jié),現(xiàn)有基于CPU的串行處理方法在多邊形相交面積計算應(yīng)用中已無法滿足快速實時的需求。
目前,GPU即圖形處理器,以其強(qiáng)大的運算能力在圖形處理方面得到了廣泛應(yīng)用,與CPU的串行處理方法不同,GPU的優(yōu)勢在于其并行處理機(jī)制,因此在處理速度方面優(yōu)勢明顯。但是,現(xiàn)有技術(shù)中,針對多邊形相交面積計算,尚缺乏基于GPU處理完成多邊形相交面積的工程實現(xiàn)方法。
另外,從相交多邊形的形狀來看,現(xiàn)有的多邊形相交面積計算方法大多針對凸多邊形的相交面積進(jìn)行計算,而對于凹多邊形的相交,多數(shù)計算方法需要先對凹多邊形進(jìn)行三角化或凸化細(xì)分。由于細(xì)分工作本身較復(fù)雜且會帶來更多的邊做相交測試,這大大增加了計算量,尤其是對于含有較多凹點或交點數(shù)量較多的多邊形更是如此。因此,現(xiàn)有技術(shù)在進(jìn)行凹多邊形相交面積計算時耗時多、工作量大、效率低,與凸多邊形相交面積計算相比,對凹多邊形相交面積的計算顯得力不從心。。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是針對上述現(xiàn)有技術(shù)的不足,而提供一種基于概率統(tǒng)計的任意多邊形相交面積計算方法,既提高多邊形相交面積計算的處理速度,又可以不受多邊形形狀的限制,可以針對任意形狀和數(shù)量的多邊形相交而計算相交面積。
為解決上述技術(shù)問題,本發(fā)明采用的一個技術(shù)方案是:提供一種基于概率統(tǒng)計的任意多邊形相交面積計算方法,所述計算方法包括如下步驟:
(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',在所述柵格區(qū)域內(nèi)隨機(jī)獨立選取m個柵格,統(tǒng)計這m個柵格中位置標(biāo)示符的值為a+nb的柵格的數(shù)目count';
(5)計算n個多邊形的相交面積S,將所述相交柵格數(shù)count'除以所述隨機(jī)獨立選取的柵格數(shù)m,然后再乘以所述柵格區(qū)域的面積,即得到所述n個多邊形的相交面積S。
在本發(fā)明另一個實施例中,步驟(1)中的所述柵格區(qū)域為所述的整個柵格場,所述柵格場的面積為SArea,則所述n個多邊形的相交面積S為:
在本發(fā)明另一個實施例中,確定所述n個多邊形柵格圖像在所述柵格場中所占用的柵格圖幅是由GPU處理完成的,具體方法是:確定所述n個多邊形在X方向坐標(biāo)的最大值Vxmax和最小值Vxmin,以及所述n個多邊形在Y方向坐標(biāo)的最大值Vymax和最小值Vymin,則由Vxmax、Vxmin和Vymax、Vymax確定的柵格范圍即為所述的柵格圖幅;且所述n個多邊形在X方向坐標(biāo)的最小值Vxmin柵格化后位于所述柵格圖幅從左至右的第一列,最大值Vxmax柵格化后位于所述柵格圖幅從左至右的最后一列,所述n個多邊形在Y方向坐標(biāo)的最小值Vymin柵格化后位于所述柵格圖幅從下至上的第一行,最大值Vymax柵格化后位于所述柵格圖幅從下至上的最后一行。
在本發(fā)明另一個實施例中,所述步驟(4)中統(tǒng)計m個柵格中位置標(biāo)示符的值為a+nb的柵格的數(shù)目由GPU處理完成,或者由GPU通過軟件環(huán)境OpenGL中的像素讀取函數(shù)將隨機(jī)選取的m個柵格及其對應(yīng)的位置標(biāo)示符的值傳送到CPU后由CPU處理完成。
在本發(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,所述隨機(jī)獨立選取的柵格數(shù)m為所述柵格場分辨率的40%、50%或者60%。
在本發(fā)明另一個實施例中,所述初始值a=0,b=1。
本發(fā)明的有益效果是:本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法是一種新穎高效的多邊形相交面積計算方法,該方法借助于GPU來實現(xiàn)任意多邊形的柵格化,將以頂點坐標(biāo)表示的多邊形轉(zhuǎn)換為以柵格表示的多邊形柵格圖像,再根據(jù)圖像的相交情況對所有柵格的位置標(biāo)示符進(jìn)行賦值、修正,再在柵格區(qū)域中隨機(jī)選取m個隨機(jī)柵格來模擬整個柵格場,統(tǒng)計m個隨機(jī)柵格中相交柵格的數(shù)目,最后再計算相交面積。該方法的優(yōu)點如下:
(1)將多邊形柵格化,利用柵格數(shù)據(jù)進(jìn)行處理,不受多邊形凹凸性的限制;另外,由于柵格數(shù)據(jù)是將幾何空間作為整體進(jìn)行描述,它以規(guī)則的陣列來表示空間對象,數(shù)據(jù)直接記錄柵格的顯示特征,而所在位置則根據(jù)行列號轉(zhuǎn)換為相應(yīng)的坐標(biāo),不受空間對象形狀的影響,具體空間對象的復(fù)雜程度不影響數(shù)據(jù)量的大小,因此處理起來也更簡便;
(2)利用了GPU的并行特性,與借助于CPU的計算方法相比,大大提升了處理速度,并且原理簡單,實現(xiàn)方便;
(3)利用少量隨機(jī)柵格來模擬柵格區(qū)域進(jìn)一步提高了時間性能。
經(jīng)過實驗結(jié)果表明,本發(fā)明的計算方法適用于任意復(fù)雜多邊形,計算方法在相交測試部分很好的避免了傳統(tǒng)計算方法所遇到的邊界問題,從而具有較好的魯棒性。
附圖說明
圖1為本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法一實施例的流程圖;
圖2為本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法另一實施例中兩個多邊形柵格圖像相交實施例的示意圖;
圖3為本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法另一實施例中運用的蒙特卡羅計算定積分的原理示意圖;
圖4為本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法另一實施例中實驗驗證采用的有“洞”多邊形示例圖。
具體實施方式
為了便于理解本發(fā)明,下面結(jié)合附圖和具體實施例,對本發(fā)明進(jìn)行更詳細(xì)的說明。附圖中給出了本發(fā)明的較佳的實施例。但是,本發(fā)明可以以許多不同的形式來實現(xiàn),并不限于本說明書所描述的實施例。相反地,提供這些實施例的目的是使對本發(fā)明的公開內(nèi)容的理解更加透徹全面。
需要說明的是,除非另有定義,本說明書所使用的所有的技術(shù)和科學(xué)術(shù)語與屬于本發(fā)明的技術(shù)領(lǐng)域的技術(shù)人員通常理解的含義相同。在本發(fā)明的說明書中所使用的術(shù)語只是為了描述具體的實施例的目的,不是用于限制本發(fā)明。本說明書所使用的術(shù)語“和/或”包括一個或多個相關(guān)的所列項目的任意的和所有的組合。
圖1是本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法一實施例的流程圖。
首先,需要說明的是,圖1所示實施例是基于GPU處理實現(xiàn)對圖形圖像的處理,而GPU處理直接與圖形圖像的顯示場景密切相關(guān),因此本發(fā)明實施例相應(yīng)涉及到柵格、柵格場等概念。這里的柵格是指對圖形圖像進(jìn)行數(shù)字化處理后的最小顯示單元,每一個柵格對應(yīng)一個顯示像素,眾多柵格以縱橫陣列形式所構(gòu)成的顯示區(qū)域稱之為柵格場,因此柵格場通常也是指顯示屏幕。例如,像素為248×248的顯示屏就對應(yīng)指有248×248個柵格的柵格場。
另外,本發(fā)明實施例的優(yōu)勢還在于柵格場中是對柵格數(shù)據(jù)進(jìn)行處理的基礎(chǔ),而柵格數(shù)據(jù)是一種面向空間的表示方法,柵格數(shù)據(jù)結(jié)構(gòu)要比矢量數(shù)據(jù)結(jié)構(gòu)(這里的矢量數(shù)據(jù)是一種面向?qū)嶓w的表示方法,它是以坐標(biāo)的形式來表示空間物體)更加適合計算機(jī)進(jìn)行處理。柵格數(shù)據(jù)是將幾何空間作為整體進(jìn)行描述,它以規(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進(jìn)行相交面積計算也是基于柵格數(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)示符進(jìn)行賦值是為了表示該柵格的顯示特征,例如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)示符的值進(jìn)行了初始賦值,并且預(yù)設(shè)為初始值a,a≥0。優(yōu)選的,a=0。
進(jìn)一步的,我們可以看出,對于步驟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后進(jìn)入步驟S2:對計算任意多邊形相交面積的第一個多邊形柵格化,在柵格區(qū)域內(nèi)生成第一個多邊形柵格圖像,即將以頂點坐標(biāo)表示的第一個多邊形轉(zhuǎn)換為由GPU處理的以柵格表示的第一個多邊形柵格圖像,并修正該多邊形柵格圖像對應(yīng)各柵格的位置標(biāo)示符的值,若該柵格區(qū)域內(nèi)任一柵格位于第一個多邊形柵格圖像的內(nèi)部或邊線上,則將該柵格對應(yīng)的位置標(biāo)示符的值在初始值a的基礎(chǔ)上進(jìn)行一次累加操作變?yōu)閍+b,b≥1;否則,若該柵格區(qū)域內(nèi)任一柵格位于第一個多邊形柵格圖像的外部,則該柵格對應(yīng)的位置標(biāo)示符的值不變。
步驟S2開始對第一個相交多邊形進(jìn)行處理,包含兩個過程,第一個過程是柵格化的過程,即以頂點坐標(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)示符進(jìn)行累加操作而改變這些位置標(biāo)示符的值,在其外部的柵格對應(yīng)的位置標(biāo)示符不進(jìn)行任何操作而保持另外這些位置標(biāo)示符的值不變。
這里,第一個柵格化的過程是由GPU處理完成的,實際應(yīng)用中可以通過圖形圖像開發(fā)軟件環(huán)境OpenGL中的glBegin()、glEnd()專用函數(shù)來實現(xiàn),其過程是通過這些專用函數(shù)將第一個多邊形的頂點坐標(biāo)順次輸入。優(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)對第一個多邊形的處理之后,進(jì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是順次對輸入的每一個多邊形進(jìn)行柵格化處理和位置標(biāo)示符的賦值處理,在步驟S2已經(jīng)對第一個多邊形進(jìn)行了處理,步驟S3是對后續(xù)的多邊形進(jìn)行處理,其目的是要計算n個多邊形相交的面積,因此步驟S3主要是針對后續(xù)n-1個多邊形,并且,對其中每一個多邊形都是獨立處理的。當(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)為例進(jìn)行說明,如圖2所示,假定該圖中第一個輸入的是一個四邊形,第二個輸入的是五邊形,本實施例中所選的柵格區(qū)域為這兩個多邊形所確定的柵格圖幅。具體過程如下:
首先經(jīng)過步驟S1對柵格區(qū)域Screen1進(jìn)行初始化,各個柵格的位置標(biāo)示符賦初始值0;
然后經(jīng)過步驟S2,在該柵格區(qū)域Screen1內(nèi)轉(zhuǎn)化生成的第一個多邊形柵格圖像T1,即在柵格區(qū)域Screen1內(nèi)傳入四邊形,通過上述步驟S2中程序示例的方式對該四邊形柵格化處理,同時將該柵格圖像T1內(nèi)部或邊線上的柵格進(jìn)行一次累加操作,使其位置標(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)示符的值進(jìn)行修正,對處于該五邊形柵格圖像T2的內(nèi)部或邊線上的柵格進(jìn)行一次累加操作,由圖2可知進(jìn)行累加操作的柵格分為兩部分,一部分是兩個圖像的相交部分,這部分柵格的位置標(biāo)示符的值經(jīng)過了兩次累加變?yōu)?,另一部分是未與四邊形柵格圖像T1相交的部分,這部分柵格的位置標(biāo)示符累加一次變?yōu)?,處于該五邊形柵格圖像T2區(qū)域外的柵格不做處理??梢钥闯?,柵格M1對應(yīng)的位置標(biāo)示符的值為2,表明該柵格M1的位置標(biāo)示符經(jīng)歷了兩次累加操作,而該柵格M1正好也是第一個多邊形柵格圖像T1和第二個多邊形柵格圖像T2相交的柵格。因此,通過柵格的位置標(biāo)示符的累加后的結(jié)果值可以判斷多邊形柵格圖像相交的情況,而且這種判斷方法實現(xiàn)簡單,也不受多邊形是凸多邊形或凹多邊形等形狀的限制,增強(qiáng)了該方法的應(yīng)用的魯棒性。
通過以上三個步驟完成了對多邊形柵格圖像相交的柵格的確定,在此基礎(chǔ)上進(jìn)一步確定相交的面積計算。
將所有多邊形柵格化處理以后,進(jìn)入步驟S4:統(tǒng)計n個多邊形柵格圖像的相交柵格數(shù)count',在柵格區(qū)域內(nèi)隨機(jī)獨立選取m個柵格,m≤RES,RES為柵格區(qū)域的分辨率,統(tǒng)計這m個柵格中位置標(biāo)示符的值為a+nb的柵格的數(shù)目,該數(shù)目即為n個多邊形柵格圖像的相交柵格數(shù)count'。
通過步驟S2、S3對n個多邊形柵格化并對柵格區(qū)域內(nèi)的所有柵格賦值、修正以后,計算n個多邊形的相交面積S就轉(zhuǎn)化為計算n個多邊形柵格圖像相交柵格的總面積。
在統(tǒng)計多邊形柵格圖像的相交柵格(像素)時,一般情況下是需要在柵格區(qū)域(整個柵格場或者柵格圖幅)范圍內(nèi)遍歷所有柵格。例如對于兩個多邊形相交,柵格區(qū)域為整個柵格場,且柵格場的分辨率RES為256×256=65536的情況,那么該方法就要遍歷65536個柵格,統(tǒng)計其中位置標(biāo)示符的值等于2的柵格的數(shù)目,這樣的處理方式需要的時間會比較長。
為此,本發(fā)明實施例的改進(jìn)之處在于不必遍歷整個柵格區(qū)域的所有柵格來統(tǒng)計多邊形柵格圖像的相交柵格數(shù),而是利用概率統(tǒng)計的原理,僅從該柵格區(qū)域內(nèi)隨機(jī)選取一定數(shù)量的柵格,通過統(tǒng)計這些隨機(jī)選取柵格中的位置標(biāo)示符為a+nb的柵格的數(shù)目即可。這是一種概率統(tǒng)計方法,即利用少量隨機(jī)柵格子塊來模擬整個柵格場,以提高時間性能。這個方法速率上比采用遍歷柵格場或者柵格圖幅的方法有提高,但是精確度會有一定降低。
需要說明的是,這里所利用的概率統(tǒng)計的原理是基于蒙特卡羅計算定積分的原理,結(jié)合圖3,對該原理進(jìn)行簡要介紹。圖3中,對于陰影區(qū)P11的面積G,該區(qū)域是由函數(shù)y=f(x)在x∈[a,b]區(qū)間所圍成的區(qū)域,由積分的面積含義有在平面區(qū)域Ω=[a,b]×[0,T]上設(shè)置一個均勻隨機(jī)變量ξ,則該隨機(jī)變量落入陰影區(qū)P11的概率產(chǎn)生一個與該隨機(jī)變量ξ對應(yīng)的隨機(jī)點(xi,yi),檢驗隨機(jī)點(xi,yi)是否落入陰影區(qū)P11內(nèi),如果滿足條件yi≤f(xi),則記錄點(xi,yi)落入陰影區(qū)P11內(nèi)一次,對于N個獨立的均勻隨機(jī)數(shù)ξi,(i≤N),記錄NS={ξ1,ξ2...,ξN}中落在陰影區(qū)P11中的個數(shù)。根據(jù)大數(shù)定理可得就是對積分的無偏估計,(b-a)T是矩形平面區(qū)域Ω的面積值。由此可見,對積分面積的計算可以通過概率統(tǒng)計而近似估計,特別是當(dāng)隨機(jī)點數(shù)量增多時這種近似估計就越準(zhǔn)確。
基于上述蒙特卡羅計算定積分的原理,我們在統(tǒng)計多邊形柵格圖像的相交柵格數(shù)時,不必遍歷柵格區(qū)域內(nèi)的所有柵格獲得位置標(biāo)示符為a+nb的柵格數(shù)目,而是只需要在該柵格區(qū)域內(nèi)多次隨機(jī)選取柵格,從這些隨機(jī)選取的柵格中統(tǒng)計位置標(biāo)示符為a+nb的柵格數(shù)目。這樣會帶來處理時間復(fù)雜度的降低,例如:若柵格區(qū)域的分辨率RES為2048×2048,則全部柵格遍歷的時間復(fù)雜度為ο(2048×2048);若從該柵格區(qū)域內(nèi)隨機(jī)選取百分之一的柵格,即1%RES=1%×2048×2048=204×204(經(jīng)過取整處理),隨機(jī)選取柵格進(jìn)行統(tǒng)計的時間復(fù)雜度為ο(204×204),顯然帶來了處理速度的提升。
本實施例在圖形圖像開發(fā)軟件環(huán)境OpenGL中,GPU將所有多邊形都柵格化形成對應(yīng)的柵格圖像以后,從這些柵格圖像占據(jù)的柵格圖幅中隨機(jī)選取m個柵格,m小于或等于該柵格圖幅或整個柵格場的分辨率,即m≤RES。然后,由GPU通過OpenGL中的glReadPixels函數(shù)將這些隨機(jī)選取的m個柵格及其對應(yīng)的位置標(biāo)示符的值傳送給CPU,再由CPU來統(tǒng)計這m個柵格中位置標(biāo)示符的值為a+nb的柵格的數(shù)目count'。這里的glReadPixels函數(shù)是由OpenGL提供的,該函數(shù)是用來讀取像素的,利用該函數(shù)可以“把已經(jīng)被保存到GPU的像素讀取到CPU”。在應(yīng)用該函數(shù)時,可以定義一個隨機(jī)數(shù)組result,從GPU中通過glReadPixels函數(shù)把result值讀出到CPU中,統(tǒng)計等于位置標(biāo)示符的值為n的個數(shù)。
另外,由于在統(tǒng)計相交柵格的數(shù)目時需要從GPU中將數(shù)據(jù)讀回CPU,這是比較耗時的,會造成CPU和GPU之間的通信延遲。因此,統(tǒng)計柵格區(qū)域內(nèi)位置標(biāo)示符的值為n的柵格的數(shù)目也可以通過GPU利用遮擋查詢方法處理完成,GPU遮擋查詢方法是在OpenGL軟件開發(fā)環(huán)境下利用ARB_occlusion_query來實現(xiàn)的,其具體過程如下:
在OPENGL1.5及后續(xù)版本以及OpenGL ES 3.0中,ARB_occlusion_query擴(kuò)展執(zhí)行GPU遮擋查詢的命令,它的查詢過程就是由GPU來確定最終在屏幕上可見像素的數(shù)量。由于像素在流水線中需要經(jīng)過各種檢驗,如alpha測試、模板測試和深度測試等(這些測試都是本領(lǐng)域的常規(guī)技術(shù),這里不再贅述),遮擋查詢就是將最終通過上述測試的像素的數(shù)量進(jìn)行計數(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擴(kuò)展執(zhí)行GPU遮擋查詢的命令,只有在這些版本上才能調(diào)用glGetQueryObjectuiv函數(shù),如果軟件版本達(dá)不到,該方法就不可用,此時可根據(jù)精度的容忍范圍選擇由CPU統(tǒng)計處理的方法。
在步驟S4的基礎(chǔ)上,以下步驟S5進(jìn)一步完成相交面積的計算:計算n個多邊形柵格圖像的相交面積S,將相交柵格數(shù)count'除以隨機(jī)獨立選取的柵格數(shù)m,然后再乘以所選柵格區(qū)域的面積,即得到n個多邊形柵格圖像的相交面積S。
通過步驟S4得到隨機(jī)選取的m個柵格中n個多邊形柵格圖像相交柵格的數(shù)目count'以后,結(jié)合柵格區(qū)域的面積和隨機(jī)數(shù)m,就可以計算這n個多邊形柵格圖像相交柵格的總面積了。
這里,所選的柵格區(qū)域分為兩種情況,一種是整個柵格場,另一種是柵格圖幅。當(dāng)所選柵格區(qū)域為整個柵格場時,若柵格場的面積為SArea,隨機(jī)選取的某一柵格位于兩相交部分的概率為S/SArea,則n個多邊形柵格圖像相交面積S的計算公式如下:
同理,當(dāng)所選柵格區(qū)域為待相交多邊形確定的柵格圖幅時,若該柵格圖幅的面積為STexArea,則相交面積S的計算公式如下:
公式(1)、(2)中的m一般是柵格場分辨率RES分別乘以40%、50%或者60%的柵格數(shù),count'是m個柵格中相交柵格的數(shù)目。
本發(fā)明基于概率統(tǒng)計的任意多邊形相交面積計算方法的基本思想來源于上述蒙特卡羅計算定積分原理,該方法是在GPU中實現(xiàn)的,原理更簡單,效率更高,而且不對多邊形的凹凸性做任何假設(shè),對于凹多邊形也可以處理,適用于任意可光柵化的幾何圖元,該方法的效率較使用CPU的方法提高數(shù)百倍。
為了檢驗本發(fā)明方法所得結(jié)果是否有效,分別給出以下3個模型并對這些模型進(jìn)行仿真比較。
實驗條件:使用C++與GLSL語言,在Microsoft Windows 7操作系統(tǒng),OpenGL 4.4.0上實現(xiàn)本發(fā)明的計算方法,實驗用計算機(jī)的CPU采用 Core(TM)i5-3337U,4G內(nèi)存,GPU為NVIDIA GeForce GT 620M。
模型1,本實驗隨機(jī)選取的兩個多邊形為P1和P2,這兩個多邊形的各個定點在平面直角坐標(biāo)為:
P1={(4,4),(1,13,)(,12,6),(98)}
P2={(11,3),(1,63,)(,18,8),(1,41,2)(98)}。
該模型是通過兩個常規(guī)的多邊形來驗證本發(fā)明計算方法的正確性。
模型2,選取兩個有“洞”的復(fù)雜多邊形,這里所說的有洞的多邊形是指類似于圖4(該圖為一個簡單的單洞多邊形示例)的多邊形,這樣的多邊形一般可以表示為一個外環(huán)和至少一個內(nèi)環(huán),該模型用于證明本發(fā)明的計算方法既可以針對凸多邊形,也能對凹多邊形進(jìn)行處理。
模型3,選取了兩個頂點數(shù)較多的凸多邊形,一個多邊形有800個頂點,另一個多邊形有358個頂點。該模型用于證明本發(fā)明的計算方法對于具有頂點數(shù)較多(大數(shù)據(jù)量)的任意多邊形具有較好的處理效果。
表1,表2和表3分別給出了上述3個模型在本發(fā)明計算方法下計算相交面積的精度及時間。本實驗中的計算方法是分別選取不同隨機(jī)點數(shù)(柵格數(shù)),重復(fù)相應(yīng)程序10次所得到的誤差值。
表1模型1實驗結(jié)果
表2模型2實驗結(jié)果
表3模型3實驗結(jié)果
以下以模型1為例,進(jìn)行誤差率分析和執(zhí)行效率對比,具體分析如下:
誤差率分析:由表1可知,在分辨率為256×256時,當(dāng)隨機(jī)點個數(shù)m取依次取40%、50%、60%時,誤差率的值分別為2.84、2.1、1.89;分辨率為512×512時,誤差率的值分別為0.19、0.09、0.08;分辨率為1024×1024時,誤差率的值分別為0.078、0.075、0.067。由上述數(shù)據(jù)可知,一方面在隨機(jī)個數(shù)相同的情況下,隨著分辨率的逐漸提高,該計算方法的誤差率會隨之越來越?。涣硪环矫嬖诜直媛什蛔兊那闆r下,隨著隨機(jī)點個數(shù)m的逐漸增多,誤差率也會越來越小。上述如此數(shù)量級別的舍入誤差在很多工程和一些大型軟件中都是可接受的。
執(zhí)行效率對比:由表1可知,在分辨率為256×256時,當(dāng)隨機(jī)點個數(shù)m依次取40%、50%、60%時,執(zhí)行時間分別為0.002s、0.002s、0.003s;分辨率為512×512時,執(zhí)行時間分別為0.007s、0.008s、0.011s;分辨率為1024×1024時,執(zhí)行時間分別為0.024s、0.026s、0.028s。由上述數(shù)據(jù)可知,雖然隨著分辨率的逐漸提高和隨機(jī)點個數(shù)m的逐漸增多,執(zhí)行時間會有增加,但是增加的幅度非常小。而現(xiàn)有采用CPU的計算方法在分辨率增加一個數(shù)量級時,執(zhí)行時間會成百上千倍地增加。因此,對比來看,本發(fā)明的計算方法比現(xiàn)有技術(shù)的計算方法效率提升了百倍,數(shù)據(jù)量越大,加速效果越明顯。
表2和表3分別是模型2、模型3采用本發(fā)明的方法計算相交面積的精度及時間對比,與模型1類似,這里就不再進(jìn)行詳細(xì)的數(shù)據(jù)對比說明。
另外,從表3可知,對于頂點數(shù)較多的多邊形,采用現(xiàn)有技術(shù)的計算方法即便是花費較長時間也可能計算不出結(jié)果。而對于本發(fā)明的計算方法,在256×256分辨率下,m依次取40%、50%、60%時,執(zhí)行時間分別為0.003s、0.003s、0.004s;在分辨率增加到1024×1024時,相應(yīng)的執(zhí)行時間也僅為0.027s、0.03s、0.004s、0.032s,效率提升非常大。
本發(fā)明提出的任意多邊形相交面積計算方法,引入了蒙特卡羅方法,更方便高效,面積誤差在工程上是可以接受的,這是一種以精度的適當(dāng)犧牲換取優(yōu)異綜合性能的方法。實驗結(jié)果表明,本發(fā)明的計算方法適用于多邊形數(shù)量龐大且任意復(fù)雜的多邊形,很好的避免了傳統(tǒng)計算方法所遇到的奇異性問題(邊界問題),比如重疊邊、邊與邊交于邊的頂點等情形,從而具有較好的魯棒性。
以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均包括在本發(fā)明的專利保護(hù)范圍內(nèi)。