如何计算多个重叠直角多边形的面积?

时间:2009-09-07 19:13:54

标签: geometry overlap area polygons

我正在寻找一种计算多个重叠多边形所覆盖的公共区域的方法。多边形都是直角的,如果这有助于使事情变得更容易。

例如:

   BBBBB
   BBBBB
AAA---BB
AAA---BB
AAAAAA
AA--AA
AA--AA
  LL
  LL
  LLLLLL
  LLLLLL

我想找到A,B和L所涵盖的公共区域,它们相同: B = 5x4 = 20 + A = 6x5 = 30 + L = 4x2 + 6x2 = 20 = 70 减去重叠区域: - 10 = 60(所有多边形覆盖的公共区域)

我需要能够满足3个或更多个多边形占据相同区域的情况。 有没有合适的算法,可以将x / y坐标数组的数组作为输入? (样本Java源代码非常受欢迎)。

3 个答案:

答案 0 :(得分:2)

计算这样一个区域的经典方法是使用扫描算法。您可以查看问题Area of overlapping rectangles,以便在更简单的矩形情况下获得算法的描述。

然后,您可以将多边形分解为矩形,或者调整扫描算法,以便在扫描期间隐式完成此分解。

答案 1 :(得分:0)

另一种方法是使用轮廓积分计算面积。绕着该区域的周边走动并使用格林定理和数值求积来计算面积。容易腻。

答案 2 :(得分:0)

如果您可以将多边形表示为2D int或bool数组(如果第i个槽包含在多边形中,则为A [i] [j] == 1,否则为0)然后您可以在a上创建多边形的并集更大的2D“边界”阵列。

算法是这样的:

// get your polygons, each represented by a 2D array as described above

// create a "bounding" array B that can contain all polygons (watch out for
// sparsely spaced polygons in which case B could be large)

// populate B s.t. B[i][j] == 1 if ijth slot is contained in 
// the union of all polygons

// count all slots in B where B[i][j] == 1 (this will be the "common" area)

考虑运行时间和空间要求:需要遍历每个多边形的每个槽。需要遍历边界数组B的每个槽。空间的最坏情况是所有多边形的交集是空的(并且可能它们是稀疏间隔的)。可能值得首先检查空交叉点情况......然后,如果交叉点为空,则“公共”区域只是各个区域的总和。