我有一个问题,我需要计算三个矩形中至少一个所覆盖的面积
我定义了一个函数calculate
,如下所示(为清楚起见,为冗余变量道歉):
def calculate(rec1, rec2, rec3):
if rec1 == rec2 == rec3:
return abs((rec1[1]-rec1[3])) * abs(rec1[0]-rec1[2])
else:
area1 = abs((rec1[1]-rec1[3])) * abs(rec1[0]-rec1[2])
area2 = abs((rec2[1]-rec2[3])) * abs(rec2[0]-rec2[2])
area3 = abs((rec3[1]-rec3[3])) * abs(rec3[0]-rec3[2])
xmin1, ymin1, xmax1, ymax1 = rec1[0], rec1[3], rec1[2], rec1[1]
xmin2, ymin2, xmax2, ymax2 = rec2[0], rec2[3], rec2[2], rec2[1]
xmin3, ymin3, xmax3, ymax3 = rec3[0], rec3[3], rec3[2], rec3[1]
area12 = (min(xmax1, xmax2) - max(xmin1, xmin2)) * (min(ymax1, ymax2) - max(ymin1, ymin2))
area13 = (min(xmax1, xmax3) - max(xmin1, xmin3)) * (min(ymax1, ymax3) - max(ymin1, ymin3))
area23 = (min(xmax2, xmax3) - max(xmin2, xmin3)) * (min(ymax2, ymax3) - max(ymin2, ymin3))
return (area1 + area2 + area3) - (area12 + area13 + area23)
然而,这似乎不起作用。我在公式中遗漏了什么area12
、area13
和area23
是由末尾最后两位数字表示的相交三角形的区域,例如area12
是rec1
和rec2
的相交区域
对于输入((x1,y1)表示左上角,(x2,y2)表示右下角)
(2,-1,3,-3),
(0,2,3,0),
(-3,0,1,-1)
我应该得到一个12
的输出,但是我得到了13
,简单地将+1
添加到返回值在其他测试用例中不起作用
你要找的是矩形并集的面积
在两个矩形的情况下,该面积是单个面积减去交点面积的总和。有趣的是,交叉点也是一个矩形(或空)。如果我们用
&
表示交集,用|
表示并集,那么为了推广到三个矩形,我们可以想象上面的并集由两个正矩形和一个负矩形组成。因此
找到两个矩形交点的面积,就可以考虑两个左边的最右边和两个右边的最左边。如果交叉,则交叉口为空。否则,它们的距离就是交叉点的宽度。一个类似的推理给出了高度
相关问题 更多 >
编程相关推荐