判斷兩個矩形是否重疊

2021-07-09 09:00:05 字數 2199 閱讀 1589

兩個矩形的邊均與x軸或y軸平行,即軸對齊的矩形

將第乙個矩形記做a,第二個矩形記做b

判斷矩陣a與矩陣b是否重疊(邊沿重疊也認為是重疊)

第一種方案,正向思維

按照一般的思路,先列舉出所有的矩形重疊的情況,然後,判斷是否是其中一種,如圖所示,共有四種重疊情況,我們使用紫色代表矩形a,紅色代表矩形b,並分別用p1,p2,p3,p4代表對應的左上角與右下角。如果依次判斷,過於複雜,而且容易出錯,這裡我們不再進行**實現。

第二種方案,反向思維

反向思考,我們不妨先解決出「不重疊」的情況,如圖,我們畫出了乙個並怎麼漂亮的圖,看起來十分複雜,但是,實際上,相比第一種方案,更易表示。即b矩陣,可能在a的左側、右側、上側、下側。如果用公式表示,即 (p

2.y≤

p3.y

)∨(p

1.y≥

p4.y

)∨(p

2.x≤

p3.x

)∨(p

1.x≥

p4.x

) 則,兩個矩陣重疊時,公式為 ¬[

(p2.

y≤p3

.y)∨

(p1.

y≥p4

.y)∨

(p2.

x≤p3

.x)∨

(p1.

x≥p4

.x)]

根據德·摩根定律可轉換為 (p

根據上述第二種情況分析,我們可以進行**的實現,如下

#include using namespace std;
//矩陣位置座標

typedef struct rect

int x; //矩形左上角x座標

int y; //矩形左上角y座標

int width; //矩形寬度

int height; //矩形高度

} rect;

/** *@brief 判斷兩個軸對齊的矩形是否重疊

*@param rc1 第乙個矩陣的位置

*@param rc2 第二個矩陣的位置

*@return 兩個矩陣是否重疊(邊沿重疊,也認為是重疊)

*/bool isoverlap(const rect &rc1, const rect &rc2)

int main()

此處,本文也提供乙個計算該兩個矩陣重疊面積比例的函式實現,雖然所用公式看起來不甚相同,但是,可以很容易推出來,實際上是一樣的。(注意,此**中使用了opencv內部結構)

/**
*@brief 計算兩個矩形的相交面積及組合面積,同時計算相交面積佔組合面積的比例

*@param 第乙個矩形的位置

*@param 第二個矩形的位置

*@param 兩個矩陣相交的面積大小

*@param 兩個矩陣組合的面積大小

*@return 兩個矩陣相交面積佔組合面積的比例,即重合比例。如果組合面積為0,則返回0

*/float computrectjoinunion(const cvrect &rc1, const cvrect &rc2, float& ajoin, float& aunion)

float a1 = rc1.width * rc1.height;

float a2 = rc2.width * rc2.height;

aunion = (a1 + a2 - ajoin); //兩者組合的面積

if( aunion > 0 )

return (ajoin/aunion); //相交面積與組合面積的比例

else

return

0;}

C 判斷兩個矩形是否重疊

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

遊戲中判斷兩個矩形是否重疊

教程目錄 1.小遊戲展示 3.創作乙個移動的背景 4.讓阿菌煽動翅膀 5.讓阿菌模擬重力下墜 6.讓阿菌可以摸魚 7.編寫遊戲開始與結束 8.編寫 boss 劇情 9.部署到伺服器,在手機玩耍 有興趣深入的同學後續可以考慮用 cocos 的 prefab 預製資源功能實現哦 首先我們在節點樹上新增三...

根據座標點判斷兩個矩形是否重疊

方法一 2個矩形相交,一定有交叉線的,所以用下面的方法,可以求出是否相交,並且可以確定相交的位置 假定矩形是用一對點表達的 minx,miny maxx,maxy 那麼兩個矩形rect1,rect2 相交的結果一定是個矩形,構成這個相交矩形rect的點對座標是 minx max minx1,minx...