最近在做人工智慧專案,需要對兩個矩形是否有重合做出判讀
但注意的是,不是判斷兩個檢測目標是否重合,檢測目標的矩形只要左上角點和右下角點就可表示乙個矩形,判斷是否重合比較簡單,但是現在是兩個矩形是有一定旋轉角度的,旋轉角度不定,這樣就沒法像檢測目標那樣判斷了。
目前使用四個點座標表示乙個矩形
判斷分兩個步驟:
一、當乙個矩形的頂點在另一矩形內時,則可以判斷兩個矩形有重合。當這種情況不存在時,不能判斷兩個矩形不重合,需要借助其他方法判斷。
判斷矩形任意一頂點是否在另一矩形內,這樣就需要利用點在多邊形內的判斷方法
可以參考部落格這篇部落格對原理做了較為詳細的講解,並且提供了判斷函式的不同演進形式。
int pnploy(const int poly_sides, const float *poly_x, const float *poly_y, const float x, const float y)
j = i;
}return res;
}該判斷方法又叫射線法,由點向任何乙個方向引出射線,與多邊形交點數為奇數的,則點在多邊形內,為偶數時,則點不在多邊形內,為了簡化這種判斷過程,通常c++**中使用水平射線來做計算。
二、當任一矩形的任何頂點都不在另一矩形內時,是不能判斷兩個矩形不重合的,因為還有一些特殊情況
特例如下,以下情況就是頂點不在另乙個矩形內,但是矩形重合的。
這樣就需要利用矩形邊交叉來判斷重合,通常矩形邊交叉,則相互重合的。
這樣就需要判斷兩條線段是否交叉,
該部落格為我提供了方法
判斷線段交叉兩個步驟,(1)快速排斥 (2)跨立實驗,具體請參考我上面提供的鏈結
bool linecross(const point a, const point b, const point c,const point d)
好,這樣我們就可以基於以上提供的方法,做出兩個矩形是否會重合的判斷邏輯了,目前可以試用於四邊形,沒測試過其他形狀。大家如果覺得判斷有問題或者一些效率上的問題,歡迎提出。
//目前只支援4邊形互動
bool checkployintersect(const point ploy1[4], const point ploy2[4])
for(int i =0; i<4; i++)
if(pnploy(4,polygon2.x,polygon2.y, polygon1.x[i], polygon1.y[i]))
}for(int i=0; i<4; i++)}}
return false;
}
判斷兩個矩形是否重疊
兩個矩形的邊均與x軸或y軸平行,即軸對齊的矩形 將第乙個矩形記做a,第二個矩形記做b 判斷矩陣a與矩陣b是否重疊 邊沿重疊也認為是重疊 第一種方案,正向思維 按照一般的思路,先列舉出所有的矩形重疊的情況,然後,判斷是否是其中一種,如圖所示,共有四種重疊情況,我們使用紫色代表矩形a,紅色代表矩形b,並...
sql 判斷兩個時間段是否有重合,是否存在交集
總結起來就一句話 最小值小於最大值並且最大值大於最小值,則一定重疊。我的使用場景 a 表 將時間有交叉的資料查出來 我的演算法 start time,end time 1 and 2 1 剔除完全相同 a1.start time a2.start time and a1.end time a2.en...
C 判斷兩個矩形是否重疊
矩形以列表 x1,y1,x2,y2 的形式表示,其中 x1,y1 為左下角的座標,x2,y2 是右上角的座標。如果相交的面積為正,則稱兩矩形重疊。需要明確的是,只在角或邊接觸的兩個矩形不構成重疊。給出兩個矩形,判斷它們是否重疊並返回結果。示例 1 輸入 rec1 0,0,2,2 rec2 1,1,3...