[英]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.