問題:給定兩個矩形a和b,矩形a的左上角座標為(xa1,ya1),右下角座標為(xa2,ya2),矩形b的左上角座標為(xb1,yb1),右下角 座標為(xb2,yb2)。
(1)設計乙個演算法,確定兩個矩形是否相交(即有重疊區域)
(2)如果兩個矩形相交,設計乙個演算法,求出相交的區域矩形
(1) 對於這個問題,一般的思路就是判斷乙個矩形的四個頂點是否在另乙個矩形的區域內。這個思路最簡單,但是效率不高,並且存在錯誤,錯誤在**,下面分析一 下。
如上圖,把矩形的相交(區域重疊)分成三種(可能也有其他劃分),對於第三種情況,如圖中的(3),兩個矩形相交,但並不存在乙個矩形的頂點在另乙個矩形 內部。所以那種思路存在乙個錯誤,對於這種情況的相交則檢查不出。
仔細觀察上圖,想到另一種思路,那就是判斷兩個矩形的中心座標的水平和垂直距離,只要這兩個值滿足某種條件就可以相交。
矩形a的寬 wa = xa2-xa1 高 ha = ya2-ya1
矩形b的寬 wb = xb2-xb1 高 hb = yb2-yb1
矩形a的中心座標 (xa3,ya3) = ( (xa2+xa1)/2 ,(ya2+ya1)/2 )
矩形b的中心座標 (xb3,yb3) = ( (xb2+xb1)/2 ,(yb2+yb1)/2 )
所以只要同時滿足下面兩個式子,就可以說明兩個矩形相交。
1) | xb3-xa3 | <= wa/2 + wb/2
2) | yb3-ya3 | <= ha/2 + hb/2
即:| xb2+xb1-xa2-xa1 | <= xa2-xa1 + xb2-xb1
| yb2+yb1-ya2-ya1 | <=y a2-ya1 + yb2-yb1
(2) 對於這個問題,假設兩個矩形相交,設相交之後的矩形為c,且矩形c的左上角座標為(xc1,yc1),右下角座標為(xc2,yc2),經過觀察上圖,很 顯然可以得到:
xc1 = max(xa1,xb1)
yc1 = max(ya1,yb1)
xc2 = min(xa2,xb2)
yc2 = min(ya2,yb2)
這樣就求出了矩形的相交區域。
另外,注意到在不假設矩形相交的前提下,定義(xc1,yc1),(xc2,yc2),且xc1,yc1,xc2,yc2的值由上面四個式子得出。這樣, 可以依據xc1,yc1,xc2,yc2的值來判斷矩形相交。
xc1,yc1,xc2,yc2只要同時滿足下面兩個式子,就可以說明兩個矩形相交。
3) xc1 <= xc2
4) yc1 <= yc2
即:max(xa1,xb1) <= min(xa2,xb2)
max(ya1,yb1) <= min(ya2,yb2)
判斷兩個矩形相交以及求出相交的區域
問題 給定兩個矩形a和b,矩形a的左上角座標為 xa1,ya1 右下角座標為 xa2,ya2 矩形b的左上角座標為 xb1,yb1 右下角 座標為 xb2,yb2 1 設計乙個演算法,確定兩個矩形是否相交 即有重疊區域 2 如果兩個矩形相交,設計乙個演算法,求出相交的區域矩形 1 對於這個問題,一般...
判斷矩形相交以及求出相交區域
問題 給定兩個矩形a和b,矩形a的左上角座標為 xa1,ya1 右下角座標為 xa2,ya2 矩形b的左上角座標為 xb1,yb1 右下角座標為 xb2,yb2 1 設計乙個演算法,確定兩個矩形是否相交 即有重疊區域 2 如果兩個矩形相交,設計乙個演算法,求出相交的區域矩形 1 對於這個問題,一般的...
判斷矩形相交以及求出相交的區域
問題 給定兩個矩形a和b,矩形a的左上角座標為 xa1,ya1 右下角座標為 xa2,ya2 矩形b的左上角座標為 xb1,yb1 右下角座標為 xb2,yb2 1 設計乙個演算法,確定兩個矩形是否相交 即有重疊區域 2 如果兩個矩形相交,設計乙個演算法,求出相交的區域矩形 解答 1 對於這個問題,...