一种基于GPU的任意多边形相交面积计算方法与流程

文档序号:12126089阅读:325来源:国知局
一种基于GPU的任意多边形相交面积计算方法与流程

本发明涉及多边形相交面积计算领域,具体涉及一种基于GPU的任意多边形相交面积计算方法。



背景技术:

平面多边形相交面积的应用非常广泛,在计算机图形学、计算几何学及计算流体力学等领域都需要计算相交多边形共同覆盖区域的面积,其内容包含了相交测试和相交面积两个部分,相交面积将确定多边形相交的形状和面积计算。

现有的多边形相交面积计算方法一般是是由计算机的通用处理器(CPU)以串行处理方式来实现。近年来,在计算机动画、虚拟现实等领域,为了表现更丰富的细节,现有基于CPU的串行处理方法在多边形相交面积计算应用中已无法满足快速实时的需求。

目前,GPU即图形处理器,以其强大的运算能力在图形处理方面得到了广泛应用,与CPU的串行处理方法不同,GPU的优势在于其并行处理机制,因此在处理速度方面优势明显。但是,现有技术中,针对多边形相交面积计算,尚缺乏基于GPU处理完成多边形相交面积的工程实现方法。

另外,从相交多边形的形状来看,现有的多边形相交面积计算方法大多针对凸多边形的相交面积进行计算,而对于凹多边形的相交,多数计算方法需要先对凹多边形进行三角化或凸化细分。由于细分工作本身较复杂且会带来更多的边做相交测试,这大大增加了计算量,尤其是对于含有较多凹点或交点数量较多的多边形更是如此。因此,现有技术在进行凹多边形相交面积计算时耗时多、工作量大、效率低,与凸多边形相交面积计算相比,对凹多边形相交面积的计算显得力不从心。



技术实现要素:

本发明的目的是针对上述现有技术的不足,而提供一种基于GPU的任意多边形相交面积计算方法,既提高多边形相交面积计算的处理速度,又可以不受多边形形状的限制,可以针对任意形状和数量的多边形相交而计算相交面积。

为解决上述技术问题,本发明采用的一个技术方案是:一种基于GPU的任意多边形相交面积计算方法,该方法包括如下步骤:

(1)在栅格场中确定一个栅格区域,并对所述该栅格区域初始化,将所述栅格区域内各栅格对应的位置标示符的值均预设为初始值a,a≥0;

(2)在所述栅格区域内生成第一个多边形栅格图像,将以顶点坐标表示的第一个多边形对应转换为由GPU处理的以栅格表示的第一个多边形栅格图像,若所述栅格区域内任一栅格位于所述第一个多边形栅格图像的内部或边线上,则将所述栅格对应的位置标示符的值累加b变为a+b,b≥1,否则,若所述栅格区域内任一栅格位于所述第一个多边形栅格图像的外部,则所述栅格对应的位置标示符的值不变;

(3)继续生成第2~n个多边形栅格图像,按照步骤(2)所述方法顺次在所述栅格区域内继续生成其余n-1个多边形栅格图像,n≥2,其中,在生成每一个当前多边形栅格图像时,若所述栅格区域内任一栅格位于所述当前多边形栅格图像的内部或边线上,则将所述栅格对应的位置标示符的值累加b,否则,若所述栅格区域内任一栅格位于所述当前多边形栅格图像的外部,则所述栅格对应的位置标示符的值不变;

(4)统计n个多边形栅格图像的相交栅格数count,统计所述栅格区域内位置标示符的值为a+nb的栅格的数目,该数目即为n个多边形栅格图像的相交栅格数count;

(5)计算n个多边形的相交面积,将所述的相交栅格数count除以所述栅格区域的分辨率,然后再乘以栅格区域的面积,即得到所述n个多边形的相交面积S。

在本发明另一个实施例中,步骤(1)中的所述栅格区域为所述的整个栅格场,则步骤(4)中统计n个多边形栅格图像相交栅格数的方法是:遍历所述栅格场中的每一个栅格,确定每一个栅格对应的位置标示符的值,找到其中位置标示符的值为a+nb的栅格,并计算这些栅格的数目。

在本发明另一个实施例中,步骤(1)中的所述栅格区域为所述的n个多边形栅格图像在所述栅格场中所占用的栅格图幅,则步骤(4)中统计n个多边形栅格图像相交栅格数的方法是:遍历所述栅格图幅中的每一个栅格,找到其中位置标示符的值为a+nb的栅格,并计算这些栅格的数目。

在本发明另一个实施例中,确定所述n个多边形栅格图像在所述栅格场中所占用的栅格图幅是由GPU处理完成的,具体方法是:确定所述n个多边形在X方向坐标的最大值Vxmax和最小值Vxmin,以及所述n个多边形在Y方向坐标的最大值Vymax和最小值Vymin,则由VxmaxVxminVymaxVymin确定的栅格范围即为所述的栅格图幅;且所述n个多边形在X方向坐标的最小值Vxmin栅格化后位于所述栅格图幅从左至右的第一列,最大值Vxmax栅格化后位于所述栅格图幅从左至右的最后一列,所述n个多边形在Y方向坐标的最小值Vymin栅格化后位于所述栅格图幅从下至上的第一行,最大值Vymax栅格化后位于所述栅格图幅从下至上的最后一行。

在本发明另一个实施例中,所述步骤(4)中统计所述栅格区域内位置标示符的值为a+nb的栅格的数目由GPU处理完成,或者由GPU通过软件环境OpenGL中的像素读取函数将所有要遍历的栅格及其对应的位置标示符的值传送到CPU后由CPU处理完成的。

在本发明另一个实施例中,GPU利用遮挡查询方法统计所述栅格区域内位置标示符的值为a+nb的栅格的数目。

在本发明另一个实施例中,所述CPU为Inter Core(TM)i5-3337U处理器,所述GPU为NVIDIA GeForce GT 620M,操作系统为Microsoft Windows 7、软件环境OpenGL为OpenGL 4.4.0。

在本发明另一个实施例中,所述步骤(2)和(3)中将以顶点坐标表示的多边形对应转换为由GPU处理的以栅格表示的多边形栅格图像的方法为:在OpenGL软件环境中构建转换处理函数,向所述转换处理函数顺次输入所述多边形所有顺序排列的顶点坐标,所述转换处理函数输出的即为所述各顶点坐标按照输入顺序首尾相连构成的所述以栅格表示的多边形栅格图像。

在本发明另一个实施例中,所述栅格场的分辨率包括256×256、512×512、1024×1024、2048×2048。

在本发明另一个实施例中,所述初始值a=0,b=1。

本发明的有益效果是:本发明基于GPU的任意多边形相交面积计算方法是一种新颖高效的多边形相交面积计算方法,该方法借助于GPU来实现任意多边形的栅格化,将以顶点坐标表示的多边形转换为以栅格表示的多边形栅格图像,同时根据图像的相交情况对所有栅格的位置标示符进行赋值、修正,再由CPU或者GPU来统计相交栅格的数目并计算相交面积。该方法的优点如下:

(1)将多边形栅格化,利用栅格数据进行处理,不受多边形凹凸性的限制;另外,由于栅格数据是将几何空间作为整体进行描述,它以规则的阵列来表示空间对象,数据直接记录栅格的显示特征,而所在位置则根据行列号转换为相应的坐标,不受空间对象形状的影响,具体空间对象的复杂程度不影响数据量的大小,因此处理起来也更简便;

(2)利用了GPU的并行特性,与借助于CPU的计算方法相比,大大提升了处理速度,并且原理简单,实现方便。

(3)利用遮挡查询方法进行避免了GPU与CPU之间的数据传递,进一步提升了执行效率。

实验结果表明,本发明的计算方法适用于任意复杂多边形,很好的避免了传统计算方法所遇到的奇异性问题(边界问题),比如重叠边、边与边交于边的顶点等情形,从而具有较好的鲁棒性。

附图说明

图1是本发明基于GPU的任意多边形相交面积计算方法的流程图;

图2是本发明基于GPU的任意多边形相交面积计算方法另一实施例中两个多边形栅格图像相交实施例的示意图;

图3是本发明基于GPU的任意多边形相交面积计算方法另一实施例中有“洞”多边形示例图。

具体实施方式

为了便于理解本发明,下面结合附图和具体实施例,对本发明进行更详细的说明。附图中给出了本发明的较佳的实施例。但是,本发明可以以许多不同的形式来实现,并不限于本说明书所描述的实施例。相反地,提供这些实施例的目的是使对本发明的公开内容的理解更加透彻全面。

需要说明的是,除非另有定义,本说明书所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是用于限制本发明。本说明书所使用的术语“和/或”包括一个或多个相关的所列项目的任意的和所有的组合。

如图1所示为本发明提供的基于GPU的任意多边形相交面积计算方法实施例一的流程图。

首先,需要说明的是,图1所示实施例是基于GPU处理实现对图形图像的处理,而GPU处理直接与图形图像的显示场景密切相关,因此本发明实施例相应涉及到栅格、栅格场等概念。这里的栅格是指对图形图像进行数字化处理后的最小显示单元,每一个栅格对应一个显示像素,众多栅格以纵横阵列形式所构成的显示区域称之为栅格场,因此栅格场通常也是指显示屏幕。例如,像素为248×248的显示屏就对应指有248×248个栅格的栅格场。

另外,本发明实施例的优势还在于栅格场是对栅格数据进行处理的基础,而栅格数据是一种面向空间的表示方法,栅格数据结构要比矢量数据结构(这里的矢量数据是一种面向实体的表示方法,它是以坐标的形式来表示空间物体)更加适合计算机进行处理。栅格数据是将几何空间作为整体进行描述,它以规则的阵列来表示空间对象,数据直接记录栅格的显示特征,而所在位置则根据行列号转换为相应的坐标,不受空间对象形状的影响,空间对象的复杂程度不影响数据量的大小。而矢量数据结构是通过记录坐标的方式尽可能精确地表示点、线和多边形等具体的空间物体,但是物体越复杂,描述就越困难,数据量也随之增大。因此,比较而言,栅格数据要比矢量数据结构简单得多,基于空间的几何分析也相对容易。本发明实施例中,将以矢量数据表示的多边形转化为以栅格数据表示的多边形栅格图像的过程即为栅格化。

本实施例要利用GPU进行相交面积计算也是基于栅格数据实现的。

如图1可知,该实施例的方法包括如下步骤:

步骤S1:在栅格场中确定一个栅格区域,并对该栅格区域初始化,即将栅格区域内各栅格对应的位置标示符的值均预设为初始值a,a≥0。

这里,步骤S1的目的是完成对栅格场的初始化。如上所述,栅格场是指整个显示区域或显示屏幕,而在对图形相交面积计算中,相交图形在显示屏幕上显示并不一定占据整个屏幕,因此只需选定一个合理的区域即可,这个显示区域实际上是由各个相交多边形占有的显示区域共同决定的,在该显示区域内能够包括各个相交多边形,同时这个显示区域尽可能小,这样有利于提高处理速度。这个显示区域就是步骤S1中需要确定的栅格区域。

另外,步骤S1中栅格对应的位置标示符的含义是指在栅格场中的每一个栅格都对应一个位置标识符,该位置标识符属于一种栅格数据。例如,在一个有248×248个栅格的栅格场中,若将左下角顶点的第一个栅格对应的位置标识符表示为rct(0,0),其中第一个0表示横向坐标,第二个0表示纵向坐标,因此临近该顶点栅格的上方一个栅格的位置标识符表示为rct(0,1),而临近该顶点栅格的右方一个栅格的位置标识符表示为rct(1,0),以此类推。对栅格对应的位置标示符进行赋值是为了表示该栅格的显示特征,例如rct(0,0)=0可以表示该顶点栅格没有显示任何内容,即空白显示,而rct(0,0)=1可以表示该顶点栅格有显示内容。优选的,在本发明实施例中我们可以规定若一个栅格位于一个多边形栅格图像所围成的区域内或者在该多边形栅格图像的边线上,则该栅格的位置标识符的值为1或者在原有值的基础上加1,若该栅格位于该多边形栅格图像所围成的区域外部(即不在该多边形栅格图像的内部和边线上),则该栅格的位置标识符的值为0或者对原有值不做任何运算。

步骤S1中只是对确定的栅格区域内各栅格对应的位置标示符的值进行了初始赋值,并且预设为初始值a,a≥0。优选的,a=0。

进一步的,我们可以看出,对于步骤S1,需要确定一个合理的栅格区域,这个栅格区域既可以是整个栅格场,也可以是通过GPU根据待计算相交面积的所有多边形所确定的栅格图幅。这里,栅格图幅为由待计算相交面积的所有这些多边形经过栅格化后在栅格场中所确定的栅格范围。

为此,本发明实施例提供一个确定栅格图幅的优选实施例:首先,对于以矢量数据表示的这些多边形的所有顶点的坐标,确定这些多边形在X方向上坐标的最大值和最小值分别为VxmaxVxmin,在Y方向上坐标的最大值和最小值分别为VymaxVymin;然后,在这些相交多边形栅格化过程中,X方向坐标的最小值Vxmin栅格化后位于栅格图幅从左至右的第一列,最大值Vxmax栅格化后位于栅格图幅从左至右的最后一列,Y方向坐标的最小值Vymin栅格化后位于栅格图幅从下至上的第一行,最大值Vymax栅格化后位于栅格图幅从下至上的最后一行。

对于该栅格图幅的面积,则为(Vxmax-Vxmin)x(Vymax-Vymin)。

图1中,完成步骤S1后进入步骤S2:对计算任意多边形相交面积的第一个多边形栅格化,在栅格区域内中生成第一个多边形栅格图像,将以顶点坐标表示的第一个多边形转换为由GPU处理的以栅格表示的第一个多边形栅格图像,并修正该多边形栅格图像对应各栅格的位置标示符的值,若该栅格区域内任一栅格位于第一个多边形栅格图像的内部或边线上,则将该栅格对应的位置标示符的值在初始值a的基础上进行累加操作变为a+b,b≥1;否则,若该栅格区域内任一栅格位于第一个多边形栅格图像的外部,则该栅格对应的位置标示符的值不变。

由于本发明采用逐一转化和赋值的方式对待相交多边形进行栅格化处理,那么首先就需要对待相交的第一个多边形栅格化,将以顶点坐标表示的第一个多边形转换为由GPU处理的以栅格表示的第一个多边形栅格图像。步骤S2开始对第一个相交多边形进行处理,包含两个过程,第一个过程是栅格化的过程,即以顶点坐标表示的第一个多边形转化为栅格数据表示的第一个多边形栅格图像,这里,顶点坐标属于一种矢量数据,而栅格数据是指栅格显示的像素特征数据,比如由灰度、亮度、色彩等特征数据;第二个过程是栅格的位置标示符赋值的过程,主要是针对第一个多边形栅格图像的内部(包括边线)和外部加以区分,在其内部的栅格对应的位置标示符进行累加操作而改变这些位置标示符的值,在其外部的栅格对应的位置标示符不进行任何操作而保持另外这些位置标示符的值不变。

这里,第一个栅格化的过程是由GPU处理完成的,实际应用中可以通过图形图像开发软件环境OpenGL中的glBegin(GL_POLYGON)、glEnd()专用函数来实现,其过程是通过这些专用函数将第一个多边形的顶点坐标顺次输入,即在GPU处理函数中,顺次输入多边形所有顺序排列的顶点坐标,各顶点坐标按照输入顺序(顺时针或者逆时针)首尾相连即构成以栅格表示的多边形栅格图像。优选的,这里的多边形是指由同一平面上不同的点首尾顺次连接,任一个顶点都在边上,且任意不相邻的两条边不相交所构成的空间图形,因此包括了凸多边形和凹多边形。这样,经过栅格化之后,第一个多边形就转化为栅格图像,即第一个多边形对应的第一个多边形栅格图像。

优选的,步骤S2中累加操作值b为1,当步骤S1中的a值为0时,则经过步骤S2之后,在第一个多边形栅格图像内部(包括边线)的所有栅格对应的位置标示符的值为1,而在第一个多边形栅格图像外部的栅格对应的位置标示符的值为0。

以下一段处理程序示例是在OpenGL软件开发环境下实现对多边形的栅格化处理:

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)表示顺次输入多边形所有顺序排列的顶点坐标,可见该示例的多边形是有四个顶点的四边形,glEnd()表示栅格化处理结束。

在OpenGL软件开发环境下,通过上述处理程序示例即可完成对输入的以顶点坐标表示的多边形转换为由GPU处理的以栅格表示的多边形栅格图像,这已经是栅格化的过程。此时,这个经过转化后的四边形栅格图像里面的每一个栅格此时对应的位置标示符都变为了1(传入之前为0)。然后,在后续步骤中可以继续通过glBegin(GL_POLYGON)和glEnd()这样的函数语句传入下一个多边形,如果存在相交,则相交部分的位置标示符的值会不断的累加。

图1中,在步骤S2实现对第一个多边形的处理之后,进入步骤S3完成后续对其他多边形的处理:按照与步骤S2相类似的方法依次对其余n-1个多边形栅格化,继续生成第2~n个多边形栅格图像,n≥2,并在栅格化过程中修正每个多边形栅格图像对应各栅格的位置标示符的值;其中,在生成每一个当前多边形栅格图像时,若栅格区域内任一栅格位于当前多边形栅格图像的内部或边线上,则将该栅格对应的位置标示符的值累加b,否则,若栅格区域内任一栅格位于当前多边形栅格图像的外部,则该栅格对应的位置标示符的值不变。

步骤S3是顺次对输入的每一个多边形进行栅格化处理和位置标示符的赋值处理,在步骤S2中已经对第一个多边形进行了处理,步骤S3是对后续的多边形进行处理,其目的是要计算n个多边形相交的面积,因此步骤S3主要是针对后续n-1个多边形,并且,对其中每一个多边形都是独立处理的。按照这样顺次执行的方式操作只需对栅格是否在当前栅格图像内部(包括边线)和外部作出判断,若某一栅格在当前栅格图像内部或边线上,则对该栅格对应的位置标示符的值做一次累加,否则若该栅格在当前栅格图像的外部,则不做累加。这种判断和累加只与当前栅格图像有关,而与其它已经栅格化的栅格图像无关。当正在处理其中某一个多边形时,该多边形对应生成的多边形栅格图像即为当前多边形栅格图像。

比如,在生成第2个多边形栅格图像时,如果某一栅格位于第2个多边形栅格图像的内部或边线上将该栅格对应的位置标示符的值做一次累加运算,即累加b,b优选为1,否则,不做累加运算。至于之前该栅格是否在第1个多边形栅格图像内部(包括边线)还是外部,并不影响对第2个多变形栅格图像的处理。因此,上述步骤S2和步骤S3相结合对多个多边形顺次处理的方法保证了对每一个多边形栅格图像处理的独立性,同时也能保证最终对这n个多边形相交面积的计算。

由上述过程可知,在该栅格区域内,如果某一个栅格没有与任何一个多边形栅格图像相交,则其对应的位置标示符的值仍为初始值0,如果某一个栅格只位于任意一个多边形栅格图像的内部或边线上,则其对应的位置标示符的值为1,如果位于任意两个多边形栅格图像的内部或边线上,则其对应的位置标示符的值为2,如果位于任意三个多边形栅格图像的内部或边线上,则其对应的位置标示符的值为3,……由此类推,如果某一个栅格位于n个多边形栅格图像的内部或边线上,则其对应的位置标示符的值为n。需要说明的是,由于本发明的目的是要计算n个多边形的相交面积,那么只有位置标示符的值为n的栅格才是我们要统计计算的。

本步骤的多边形栅格化仍由GPU通过OpenGL中语句glBegin(GL_POLYGON)和glEnd()顺序传入对应的多边形坐标顶点来实现,如果存在相交,则相交部分栅格的位置标示符的值会不断的累加。

以图2中两个多边形相交(即n为2)为例进行说明,如图2所示,假定该图中第一个输入的是一个四边形,第二个输入的是五边形,本实施例中所选的栅格区域为这两个多边形所确定的栅格图幅。具体过程如下:

首先经过步骤S1对栅格区域Screen1进行初始化,各个栅格的位置标示符赋初始值0;

然后经过步骤S2,在该栅格区域Screen1内转化生成的第一个多边形栅格图像T1,即在栅格区域Screen1内传入四边形,通过上述步骤S2中程序示例的方式对该四边形栅格化处理,同时将该栅格图像T1内部或边线上的栅格进行一次累加操作,使其位置标示符的值从初始值0变为1,而四边形栅格图像T1区域外的栅格的位置标示符的值均为初始值0。

再经过步骤S3,在该栅格区域Screen1内转化生成的第二个多边形栅格图像T2,即以同样的方式在栅格区域Screen1内传入五边形,在传入该五边形的过程中,对相关栅格的位置标示符的值进行修正,对处于该五边形栅格图像T2的内部或边线上的栅格进行一次累加操作,由图2可知进行累加操作的栅格分为两部分,一部分是两个图像的相交部分,这部分栅格的位置标示符的值经过了两次累加变为2,另一部分是未与四边形栅格图像T1相交的部分,这部分栅格的位置标示符累加一次变为1,处于该五边形栅格图像T2区域外的栅格不做处理。可以看出,栅格M1对应的位置标示符的值为2,表明该栅格M1的位置标示符经历了两次累加操作,而该栅格M1正好也是第一个多边形栅格图像T1和第二个多边形栅格图像T2相交的栅格。因此,通过栅格的位置标示符的累加后的结果值可以判断多边形栅格图像相交的情况,而且这种判断方法实现简单,也不受多边形是凸多边形或凹多边形等形状的限制,增强了该方法的应用的鲁棒性。

通过以上三个步骤完成了对多边形栅格图像相交的栅格的确定,在此基础上进一步确定相交的面积计算。

将所有多边形栅格化处理以后,进入步骤S4:统计n个多边形栅格图像的相交栅格数count,在栅格区域内,统计位置标示符的值为a+nb的栅格的数目,该数目即为n个多边形栅格图像的相交栅格数count。

通过步骤S2、S3对n个多边形栅格化并对栅格区域内的所有栅格赋值、修正以后,计算n个多边形的相交面积S就转化为计算n个多边形栅格图像相交栅格的总面积。这个相交栅格总面积的值为单个栅格的面积与相交栅格数的乘积,单个栅格的面积是栅格区域的总面积与对应总栅格数(分辨率)的比值,由于栅格区域的总面积、对应总栅格数均为已知量,那么计算n个多边形的相交面积S最终就转化为计算n个多边形栅格图像的相交栅格数count。

计算n个多边形栅格图像的相交栅格数count的过程如下:在GPU中将所有多边形都栅格化形成对应的栅格图像以后,由GPU通过OpenGL中的glReadPixels函数将栅格图幅中所有要遍历的栅格及其对应的位置标示符的值传送给CPU,再由CPU来统计该栅格图幅中位置标示符为a+nb的栅格的数目count。

本实施例的glReadPixels函数是在OpenGL软件开发环境下用来对位置标示符的值为n的栅格数目进行统计的函数,在应用该函数时,可以定义一个随机数组result,用来存取栅格的位置标示符的值,再利用glReadBuffer函数指定一个要读取的缓存区,该缓存区为GPU的缓存区,且该缓存区中已保存有所要读取的栅格及其对应的位置标示符的值。本实施例通过glReadPixels函数从GPU的缓冲区中把result值读出到CPU中,统计等于n的个数。这个函数以及其OpenGL都是本领域技术人员的公知技术,这里就不再赘述了。

另外,由于栅格区域有两种选择方式,那么对应的统计n个多边形栅格图像相交栅格数也有两种方式:

第一种:当栅格区域为整个栅格场时,统计n个多边形栅格图像相交栅格数的方法为:遍历栅格场中的每一个栅格,确定每一个栅格对应的位置标示符的值,找到其中位置标示符的值为n的栅格,并计算这些位置标示符的值为n的栅格的数目;

第二种:当栅格区域是在栅格场中根据n个多边形栅格图像确定的栅格图幅时,统计n个多边形栅格图像相交栅格数的方法为:遍历该栅格图幅中的每一个栅格,找到其中位置标示符的值为n的栅格,并计算这些栅格的数目。

对于第一种方式,由于需要遍历整个栅格场的所有栅格,栅格数目非常庞大,而第二种方式栅格图幅比栅格场小的多,其栅格数目也远远小于第一种方式的栅格场,那么第二种方式所需要的时间就比第一种方式的时间短的多,效率也更高。因此,本实施例优选第二种方式。

n个多边形栅格图像的相交栅格数统计出来以后,就进入步骤S5,计算n个多边形的相交面积,将这n个多边形栅格图像的相交栅格数count除以栅格区域的分辨率RES,然后再乘以栅格区域的面积SArea,即得到n个多边形的相交面积S。

通过步骤S4得到n个多边形栅格图像相交栅格的数目count以后,结合栅格区域的总面积和栅格区域的分辨率RES,就可以计算这n个多边形栅格图像相交栅格的总面积了,具体计算公式如下:

本发明基于GPU的任意多边形相交面积计算方法的基本思想源于蒙特卡罗积分,将以顶点表示的多边形表示为以栅格表示的多边形栅格图像,整个图像处理过程在GPU中实现,原理更简单,效率更高,而且不对多边形的凹凸性做任何假设,对于凹多边形也可以处理,适用于任意可光栅化的几何图元;另外,该方法利用GPU的并行特性,与借助于CPU的计算方法相比,大大提升了处理速度,并且原理简单,实现方便。

另外,由于本发明基于GPU的任意多边形相交面积计算方法在统计相交栅格的数目时需要从GPU中将数据读回CPU,这是比较耗时的,会造成CPU和GPU之间的通信延迟。因此,为进一步在处理大数据量多边形时实现加速,本发明对实施例一提供的计算方法进行优化,提供了实施例二的第二种优化的计算方法GPU Rasterization with glquery,利用遮挡查询技术来避免这一时间消耗,根据增量水平线原理,利用模板缓冲区进行重叠测试,并采用查询列表的方式避免CPU和GPU互相等待造成的延时。

第二种优化的计算方法与第一种方法的区别仅在于第一种方法是由CPU统计n个多边形栅格图像相交栅格数,而第二种方法是由GPU利用遮挡查询统计n个多边形栅格图像相交栅格数count,GPU遮挡查询方法是在OpenGL软件开发环境下利用ARB_occlusion_query来实现的,其具体过程如下:

在OPENGL1.5及后续版本以及OpenGL ES 3.0中,ARB_occlusion_query扩展执行GPU遮挡查询的命令,它的查询过程就是由GPU来确定最终在屏幕上可见像素的数量。由于像素在流水线中需要经过各种检验,如alpha测试、模板测试和深度测试等(这些测试都是本领域的常规技术,这里不再赘述),遮挡查询就是将最终通过上述测试的像素的数量进行计数,本实施例所要统计的为位置标示符的值为n的栅格(即像素)的数目,也就是说这里的“通过上述测试的像素”即为“位置标示符的值为n的栅格”。本实施例中GPU直接通过ARB_occlusion_query调用glGetQueryObjectuiv函数统计位置标示符等于n的栅格数,解决了统计相交栅格数时从GPU读数据到CPU需要延迟时间的问题。

这两种方法在面积精度上一样,但第二种实施例的方法时间效率却比第一种有显著提高,但该方法有应用局限性,就是必须在OPENGL1.5及后续版本以及OpenGL ES 3.0中,才能通过ARB_occlusion_query扩展执行GPU遮挡查询的命令,只有在这些版本上才能调用glGetQueryObjectuiv函数,如果软件版本达不到,该方法就不可用,此时可根据精度的容忍范围选择第一种实施例的方法。

本发明提供了两种基于GPU的任意多边形相交面积计算方法,都是将多边形栅格化,利用栅格数据进行处理,不受多边形凹凸性的限制;其次,该方法利用了GPU的并行特性,与借助于CPU的计算方法相比,大大提升了处理速度,并且原理简单,实现方便;另外,第二种方法采用遮挡查询技术对相交栅格数进行统计,避免从GPU读取数据时CPU和GPU互相等待造成的延时,更进一步提高了计算效率。

下面通过实验来验证本发明计算方法的优越性,以下为实验验证过程:

实验条件:使用C++与GLSL语言,在Microsoft Windows 7操作系统,OpenGL 4.4.0上实现本发明的计算方法,实验环境用计算机的CPU采用Core(TM)i5-3337U,4G内存,GPU为NVIDIA GeForce GT 620M。

实验1给出三个模型:

模型1:随机产生的两个简单多边形P1和P2,随机选取的这两个多边形的各个定点在平面直角坐标为:P1={(4,4),(11,3),(12,6),(9,8)},P2={(11,3),(16,3),(18,8),(14,12),(9,8)},该模型通过两个常规的多边形验证本发明计算方法的正确性。

模型2:选取两个有“洞”的复杂多边形,这里所说的有洞的多边形是指类似于图3(该图为一个简单的单洞多边形示例)的多边形,这样的多边形一般可以表示为一个外环和至少一个内环,该模型用于证明本发明的计算方法既可以针对凸多边形,也能对凹多边形进行处理。

模型3:选取两个顶点数较多的凸多边形,一个多边形有800个顶点,另一个多边形有358个顶点。该模型用于证明本发明的计算方法对于具有顶点数较多(大数据量)的任意多边形具有较好的处理效果。

表1,表2和表3分别给出了上述三个模型在本发明两种计算方法下分别计算相交面积的精度及时间。

实验2是通过对不同数据规模的三角形进行相交测试来验证本发明第二种计算方法的优越效果。

表1模型1实验结果

表2模型2实验结果

表3模型3实验结果

表4实验2模型参数及实验结果

以下以模型1为例,进行误差率分析和执行效率对比分析,具体分析如下:

误差率分析:由表1可知,在256×256分辨率下,本发明的两种计算方法误差率都为0.45%。随着分辨率的提高,误差值越来越小,在512×512分辨率下,两种计算方法的误差率都仅为0.11%;在1024×1024分辨率下,两种计算方法的误差率都仅为0.05%,如此数量级别的舍入误差在很多工程和一些大型软件中都是可接受的。

执行效率对比:由表1可知,在256×256分辨率下,本发明第一种计算方法的执行时间为0.004s,第二种计算方法的执行时间也仅为0.001s;当数量级不断增加,时间虽然有增加,但是增加的幅度比较小,在512×512分辨率下,第一种计算方法的执行时间为0.012s,第二种计算方法的执行时间仅为0.002s;当数量级增加了3倍(1024×1024)时,第一种计算方法为0.032s,第二种计算方法还是仅有0.002s。而现有采用CPU的计算方法在分辨率以数量级方式增加时,其执行时间一般会呈几何倍数增加。由此表可知,在分辨率以数量级方式增加时,第一种计算方法的效率比现有计算方法提升百倍,第一种计算方法的效率提升千倍,数据量越大,加速效果越明显。

表2和表3分别是模型2、模型3在本发明的两种计算方法下分别计算相交面积的精度及时间对比,与模型1类似,这里就不再进行详细的数据对比说明。

另外,从表3可知,对于顶点数较多的多边形,本发明的第一种计算方法在1024×1024分辨率下处理此类模型仅需0.035s,第二种计算方法仅为0.007s。

从表4可知,当三角形的数量从716、2400直至增加到18363时,随着分辨率的不断提高,本发明的计算方法时间虽然也有所增加,但是几万个面片在2048×2048分辨率下,方法的执行时间只需要3秒左右。

本发明的两种计算方法都不受多边形性质影响,可适用于多边形数量庞大且任意复杂的多边形,但是第一种计算方法中由于CPU和GPU之间的通信延迟会对计算时间有一定的影响,第二种计算方法避免了CPU和GPU之间的通信延迟却受限于软件运行环境,可根据实际情况选择使用。

本发明提出的基于GPU的任意多边形相交面积计算方法,利用了图像栅格化思想,计算更为方便快速;另外,在计算方法中引入了遮挡查询法,更方便高效,面积误差在工程上也是可以接受的。实验结果表明,本发明的计算方法适用于任意复杂多边形,很好的避免了传统计算方法所遇到的奇异性问题(边界问题),比如重叠边、边与边交于边的顶点等情形,从而具有较好的鲁棒性。

以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构变换,或直接或间接运用在其他相关的技术领域,均包括在本发明的专利保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1