计算多边形联合的总覆盖区域

时间:2013-01-06 12:22:46

标签: objective-c opengl-es opengl-es-2.0 polygon computational-geometry

我有许多2D(可能相交)的多边形,我在屏幕上使用OpenGL ES渲染。所有多边形都完全包含在屏幕内。找到这些多边形的联合百分比区域到总屏幕区域的最及时方法是什么?需要及时性,因为我需要在多边形移动时立即更新覆盖区域。

目前,我将每个多边形表示为布尔数的二维数组。使用点多边形函数(来自几何包),我对屏幕上的每个点(x,y)进行采样以检查它是否属于多边形,如果是,则设置polygon [x] [y] = true,否则是假的。

在对屏幕中的所有多边形执行此操作后,我再次遍历所有屏幕像素,并检查每个多边形数组,如果任何多边形具有其多边形[x] [y]值,则将该像素计为“覆盖”设置为true。

这很有效,但随着多边形数量的增加,性能并不理想。有没有更好的方法来实现这一点,如果可能的话使用开源库?我想到了:

(1)合并多边形以获得一个或多个非重叠多边形。然后使用标准多边形面积公式计算每个多边形的面积。然后总结一下。不确定如何让它工作?

(2)以某种方式使用OpenGL。想象一下,我用单一颜色渲染所有这些多边形。是否可以使用该特定颜色计算屏幕缓冲区上的像素数?这听起来真的很不错。

这样做有效吗?

3 个答案:

答案 0 :(得分:1)

如果您知道背景颜色并且所有多边形都有其他颜色,则可以从帧缓冲区glReadPixels()读取所有像素,并简单地计算颜色与背景颜色不同的所​​有像素。

如果不满足第一个条件,您可以考虑创建自定义帧缓冲区并渲染具有相同颜色的所有多边形(例如,对于backgruond为(0.0,0.0,0.0),对于多边形为(1.0,0.0,0.0))。接下来,读取结果帧缓冲并计算整个屏幕的红色均值。

答案 1 :(得分:1)

如果要获得非重叠多边形,可以运行线交叉算法。一个简单的变体是Bentley–Ottmann algorithm,但更快的O(n log n + k)算法(有n个顶点和k个交叉点)是可能的。

给定直线交点,您可以通过构造连接交点上的两个多边形的顶点来统一两个多边形。然后,您可以跟踪另一个多边形内部的一个多边形的顶点(您可以使用多边形点函数确定您必须进入的方向),并删除所有顶点和边,直到到达多边形的外部。在那里,您可以通过在两个多边形的第二个交叉点上创建一个新顶点来修复多边形。

除非我弄错了,否则这可以在O(n log n + k * p)时间内运行,其中p是多边形的最大重叠。

在统一多边形后,您可以使用普通区域函数来计算多边形的确切面积。

答案 2 :(得分:0)

我认为用像素数计算多边形面积的尝试过于复杂,有时不准确。您可以在stackoverflow answer about calculation the area covered by a polygon中看到类似的内容,如果构建正多边形,请参阅area of a regular polygon