矩形法 矩形重疊

2021-10-10 21:54:47 字數 2208 閱讀 5682

問題一

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 為左下角的座標,(x2, y2) 是右上角的座標。如果相交的面積為正,則稱兩矩形重疊。需要明確的是,只在角或邊接觸的兩個矩形不構成重疊。給出兩個矩形,判斷它們是否重疊並返回結果。

示例 1

輸入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]

輸出:true

示例 2

輸入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]

輸出:false

解法一(間接法)

直接考慮矩形重疊的方式可能比較複雜,我們可以考慮其相反的情形,即矩形不重疊的情形,然後答案取反即可。記兩個矩形的左下和右上頂點分別為[x1,y1,x2,y2],[a1,b1,a2,b2]。那麼第二個矩形在第乙個矩形的上下左右分別對應著b1>=y2,b2<=y1,a2<=x1,a1>=x2。該演算法的時間複雜度和空間複雜度均為o(1)。

**如下

class solution:

def isrectangleoverlap(self, rec1: list[int], rec2: list[int]) -> bool:

x1, y1, x2, y2 = rec1

a1, b1, a2, b2 = rec2

return not (b1 >= y2 or b2 <= y1 or a1 >= x2 or a2 <= x1)

解法二**為判斷投影線段是否相交)

若兩個矩形在座標軸上的投影線段均有交集,那麼兩個矩形也有交集。矩形一在x軸上的投影線段為[x1,x2],矩形二的投影為[a1,a2],容易發現這兩個線段有交集的充要條件是min(x2,a2)>max(x1,a1),在y軸上有min(y2,b2)>max(y1,b1)。該演算法的時間複雜度和空間複雜度均為o(1)。

**如下

class solution:

def isrectangleoverlap(self, rec1: list[int], rec2: list[int]) -> bool:

x1, y1, x2, y2 = rec1

a1, b1, a2, b2 = rec2

return min(x2, a2) > max(x1, a1) and min(y2, b2) > max(y1, b1)

問題二

二維平面上計算出兩個由直線構成的矩形重疊後形成的總面積。每個矩形由其左下頂點和右上頂點座標表示,如圖所示。

示例:

輸入: -3, 0, 3, 4, 0, -1, 9, 2

輸出: 45

說明:假設矩形面積不會超出int的範圍。

解法一

先判斷是否相交,如果不相交,則返回兩個矩形的面積和;如果相交,則需要計算相交的面積,易得相交的面積為min(c, g) - max(a, e)) * (min(d, h) - max(b, f),從和中減去這一相交面積即可。注意為了防止整數溢位(c/c++)可能需要先減去公共面積再加area2。該演算法的時間和空間複雜度均為o(1)。

**如下

class solution:

def computearea(self, a: int, b: int, c: int, d: int, e: int, f: int, g: int, h: int) -> int:

area1 = (c-a)*(d-b)

area2 = (g-e)*(h-f)

if min(c,g) > max(a, e) and min(d, h) > max(b, f):

return area1 - (min(c, g) - max(a, e)) * (min(d, h) - max(b, f)) + area2

else:

return area1 + area2

矩形重疊檢測。

矩形重疊型別注釋 corner overlap anchor overlap same width overlap inside overlap cross overlap typedef enum em rectoverlaptype em rectoverlaptype 判斷rect重疊的型別,...

矩形重疊檢測。

矩形重疊型別注釋 corner overlap anchor overlap same width overlap inside overlap cross overlap typedef enum em rectoverlaptype em rectoverlaptype 判斷rect重疊的型別,...

626 矩形重疊

中文english 給定兩個矩形,判斷這兩個矩形是否有重疊。樣例 1 輸入 l1 0,8 r1 8,0 l2 6,6 r2 10,0 輸出 true樣例 2 輸入 0,8 r1 8,0 l2 9,6 r2 10,0 輸出 false l1代表第乙個矩形的左上角 r1代表第乙個矩形的右下角 l2代表第...