兩個矩形的邊均與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...