我正在寻找一种计算多个重叠多边形所覆盖的公共区域的方法。多边形都是直角的,如果这有助于使事情变得更容易。
例如:
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源代码非常受欢迎)。
答案 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的每个槽。空间的最坏情况是所有多边形的交集是空的(并且可能它们是稀疏间隔的)。可能值得首先检查空交叉点情况......然后,如果交叉点为空,则“公共”区域只是各个区域的总和。