簡體   English   中英

計算三個矩形中至少一個覆蓋的面積

[英]Calculating the area covered by at least one of three rectangles

我有一個問題,我需要計算三個矩形中至少一個覆蓋的面積。

我已經定義了一個函數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 , area13area23是由最后兩位數字表示的相交三角形的面積,例如area12rec1rec2的相交面積。

對於輸入 ((x1, y1) 表示左上角和 (x2,y2) 右下角)

(2,-1,3,-3),
(0,2,3,0),
(-3,0,1,-1)

我應該得到12的輸出,但我得到13並且簡單地將+1添加到返回值在其他測試用例中不起作用。

您正在尋找的是矩形聯合的面積。

在兩個矩形的情況下,該面積是各個面積的總和減去相交面積。 有趣的是,交集也是一個矩形(或空的)。 如果我們用&表示交集,用|表示並集 , 我們有

Area(A | B) = Area(A) + Area(B) - Area(A & B).

概括為三個矩形,我們可以想象上述聯合由兩個正矩形和一個負矩形組成。 因此

Area(A | B | C) = Area((A | B) | C)
 = Area(A) + Area(C) - Area(A & C) + Area(B) + Area(C) - Area(B & C) - Area(A & B) - Area(C) + Area(A & B & C)
 = Area(A) + Area(B) + Area(C) - Area(B & C) - Area(C & A) - Area(A & B) + Area(A & B & C).

然后要找到兩個矩形相交的面積,只需考慮兩個左側的最右側和兩個右側的最左側即可。 如果它們交叉,則交叉點是空的。 否則它們的距離就是交叉點的寬度。 類似的推理給你高度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM