[英]Total area of overlapping rectangles
为了可视化这个方法,如果你在一个矩形的每个垂直边缘上画一条跨越整个屏幕的垂直线,你可以看到每个都标记出一个新的矩形。 您可以通过创建所有点的 x 坐标的排序列表并删除重复项来找到这些点。
并为新的矩形着色:
现在你的问题变成了通过乘以宽度和高度来找到该区域中每个矩形的面积。
此方法解决了三个矩形重叠的问题 - 如果您使用包含 - 排除方法(添加区域并减去重叠),则需要添加三个重叠的区域,减去四个重叠的区域等。
请注意,在某些情况下(在最后一张照片中可见),两个矩形存在于一个区域中。 您需要检查一个矩形在下一个矩形开始之前结束的情况。 你也可以通过在 y 轴上划分网格来解决这个问题,但是你必须测试每个区域是否有一个矩形的一部分,这需要时间。
这是一个例子,代码本身是在 Swift 中完成的,而不是在 Python 中完成的,但是有一些图表和一篇文章可能会有所帮助。
一种简单的编码方法,虽然不是超级有效,但是使用包含-排除原则,最简单的形式是对于任何两个(可测量的)子集 A 和 B
area( A union B) = area( A) + area( B) - area( A inter B)
我们只关心轴对齐矩形的联合,矩形与矩形联合的交集本身就是矩形的联合。 所以要找到矩形 R1 的联合区域,.. Rn 我们得到递归 function (在伪代码中,因为我不知道 python,抱歉)
area ( R1 union R2 union .. Rn )
= rectarea( R1) + area( R2 union .. Rn)
- area( (R1 inter R2) union (R1 inter R3) .. (R1 inter Rn)
如果我们知道一个矩形的 xmin,xmax,ymin,ymax 那么它的面积是
(xmax-xmin)*(ymax-ymin)
如果我们有两个矩形 R 和 S,它们的交点是
(RinterS).xmin = max( R.xmin, S.xmin)
(RinterS).xmax = min( R.xmax, S.xmax)
(RinterS).ymin = max( R.ymin, S.ymin)
(RinterS).ymax = min( R.ymax, S.ymax)
在计算(R1 inter R2)等时,您必须在输入的副本而不是输入本身中执行此操作(因为输入可能会被稍后的递归调用使用)。 消除结果为空的矩形(即 xmin>=xmax 或 ymin>=ymax 的矩形)是值得的。 如果您不消除它们,则必须确保它们的面积计算为 0。
我有实现此功能的 C 代码,如果您有兴趣,我会发布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.