1. 程式人生 > >判斷兩個矩形是否相交的4個方法

判斷兩個矩形是否相交的4個方法

最近在用opencv寫一個文字定位的程式,獲取到字元輪廓之後需要進行合並,涉及到判斷矩形是否相交的問題,記得去年去三星通訊研究院面試同樣問到了這個問題,如何判斷兩條線段是否相交,如何判斷兩個矩形是否相交。以前寫過一篇如何判斷線段相交的問題,上網查了一些方法,在這裡做一下後一個問題的總結:

方法一:假定矩形是用一對點表達的(minx,miny)(maxx,   maxy) ,那麼兩個矩形rect1{(minx1,miny1)(maxx1,   maxy1)},       rect2{(minx2,miny2)(maxx2,   maxy2)}   相交的結果一定是個矩形,構成這個相交矩形rect{(minx,miny)(maxx, maxy)}的點對坐標是:   


  minx   =   max(minx1,   minx2)      miny   =   max(miny1,   miny2)        maxx   =   min(maxx1,   maxx2)        maxy   =   min(maxy1,   maxy2)    如果兩個矩形不相交,那麼計算得到的點對坐標必然滿足   
  minx   >   maxx   或者     miny   >   maxy   
  1. <pre name="code"class="cpp">bool CPreprocess::crossAlgorithm1(CvRect r1,CvRect r2)  
  2. {  
  3.     int nMaxLeft = 0;  
  4.     int nMaxTop = 0;  
  5.     int nMinRight = 0;  
  6.     int nMinBottom = 0;  
  7.     //計算兩矩形可能的相交矩形的邊界
  8.     nMaxLeft = r1.x >= r2.x ? r1.x : r2.x;  
  9.     nMaxTop = r1.y >= r2.y ? r1.y : r2.y;  
  10.     nMinRight = (r1.x + r1.width) <= (r2.x + r2.width) ? (r1.x + r1.width) : (r2.x + r2.width);  
  11.     nMinBottom = (r1.y + r1.height) <= (r2.y + r2.height) ? (r1.y + r1.height) : (r2.y + r2.height);  
  12.     // 判斷是否相交
  13.     if (nMaxLeft > nMinRight || nMaxTop > nMinBottom)  
  14.     {  
  15.         returnfalse;  
  16.     }  
  17.     else
  18.     {  
  19.         returntrue;  
  20.     }  
  21. }</pre>  
  22. <pre></pre>  
方法二:如果兩個矩形相交,則必然存線上條交叉,而能交叉的線條只有橫線和豎線,兩根橫線或兩根豎線都不可能交叉。所以,這個問題就轉化成尋找是否存在交叉的橫線與豎線。
  1. //判斷兩個矩形是否相交
  2. bool CPreprocess::crossAlgorithm2(CvRect r1,CvRect r2)  
  3. {  
  4.     //判斷兩個矩形是否相交,
  5.     //從一個矩形中取出一條橫線,與另一矩形中的一條豎線判斷是否交叉
  6.     return crossLine(r1.x, r1.x + r1.width, r1.y, r2.y, r2.y + r2.height, r2.x)  
  7.         || crossLine(r1.x, r1.x + r1.width, r1.y, r2.y, r2.y + r2.height, r2.x + r2.width)  
  8.           || crossLine(r1.x, r1.x + r1.width, r1.y + r1.height, r2.y, r2.y + r2.height, r2.x)  
  9.             || crossLine(r1.x, r1.x + r1.width, r1.y + r1.height, r2.y, r2.y + r2.height, r2.x r2.width)  
  10.               || crossLine(r2.x, r2.x + r2.width, r2.y, r1.y, r1.y + r1.height, r1.x)  
  11.                 || crossLine(r2.x, r2.x + r2.width, r2.y, r1.y, r1.y + r1.height, r1.x + r1.width)  
  12.                   || crossLine(r2.x, r2.x + r2.width, r2.y + r2.height, r1.y, r1.y + r1.height, r1.x)  
  13.                     || crossLine(r2.x, r2.x + r2.width, r2.y r2.height, r1.y + r1.height, r1.y + r1.height, r1.x r1.width);  
  14. }  
  15. //判斷直線是否相交
  16. bool CPreprocess::crossLine(int left,int right,int x,int top,int bottom,int y)  
  17. {  
  18.     return (top < y) && (bottom > y) && (left < x) && (right > x);  
  19. }  

方法三:

朋友面試的時候碰到這樣的問題. 

一句程式碼, 判斷兩個矩形是否相交.
我想了想, 寫了下面的程式碼.  typedef struct { int left; int right; int top; int bottom; }RECT; bool isRectOverlap(const RECT& r1, const RECT& r2) { return !(r1.left > r2.right || r1.top > r2.bottom || r2.left > r1.right || r2.top > r1.bottom); } 運用逆向思維考慮這個問題或許會好一點. 1. 判斷 r1 的左上角是否在 r2 的右下角的下面或者右面 2. 判斷 r2 的左上角是否在 r1 的右下角的下面或者右面 3. 結果求反.

方法四:

第二種方法

兩個矩形相交的條件:兩個矩形的重心距離在XY軸上都小於兩個矩形長或寬的一半之和.這樣,分兩次判斷一下就行了.

bool CrossLine(Rect r1,RECT r2)
{
if(abs((r1.x1+r1.x2)/2-(r2.x1+r2.x2)/2)<((r1.x2+r2.x2-r1.x1-r2.x1)/2) && abs((r1.y1+r1.y2)/2-(r2.y1+r2.y2)/2)<((r1.y2+r2.y2-r1.y1-r2.y1)/2))
return true;
return false;
}

相關推薦

判斷矩形是否相交4方法

最近在用opencv寫一個文字定位的程式,獲取到字元輪廓之後需要進行合並,涉及到判斷矩形是否相交的問題,記得去年去三星通訊研究院面試同樣問到了這個問題,如何判斷兩條線段是否相交,如何判斷兩個矩形是否相交。以前寫過一篇如何判斷線段相交的問題,上網查了一些方法,在這裡做一下後

判斷矩形是否相交的原理詳解

bool Rect::intersectsRect(const Rect& rect) const {     return !(     getMaxX() < rect.getMinX() ||              rect.getMaxX() &l

快速判斷矩形是否相交

兩個矩形之間的位置關係無外乎圖中的5中case. 難道我們要每個case都要判斷一邊,然後決定是否相交? 其實是有通用方法的。 如果兩個矩形相交,那麼矩形A B的中心點和矩形的邊長是有一定關係的。 Case 2345中,兩個中心點間的距離肯定小於AB邊長和的一半。

判斷矩形是否相交(C++)

最近在研究opencv識別紅綠燈的任務,用的是機器學習+影象處理的方法,但有個麻煩的問題就是誤識別率很高,為了把這些誤識別出的物體給過濾點,我想到了通過顏色佔比的方法來過濾,結果是可以過濾點一部分,但不能完全過濾。沒辦法,接下來有打算用紅綠燈框匹配燈的辦法來過濾,這就涉及

判斷矩形是否相交演算法

兩個矩形的空間位置(2d)有四種情況,如下圖: 給兩個矩形命名為A,B分別卻兩個矩形的坐上和右下角座標(Ax0,Ay0),(Bx0,By0),根據四種情況的判斷相交有四種情況,也就是說要寫四個判斷,這個就有點囉嗦了,其實根據這四種情況可以推出規律,如下圖: 這樣演算法就

【演算法】計算機圖形學的一些經典小題:判斷點在多邊形內,隨機生成三角形內的點,判斷矩形是否相交

前幾天面試的時候被問到了,如何隨機在三角形內生成點,我按照我的想法回答了一遍,但覺得回答的不夠好。最後面試官說了一個最優的方法。覺得不錯,順帶總結一下最近看到的一些關於計算機圖形學方面的經典小題,知乎上看到的還有Leetcode上的 1.判斷一個點

Opencv求矩形是否相交,以及他們的重疊度

在影象處理中經常會遇到判斷兩個矩形是否相交,以及相交的比例的情況,下面是來自TLD演算法中原始碼的求法: float bbOverlap(const BoundingBox& box1,const BoundingBox& box2) {   if (box

Opencv求矩形是否相交,以及相交的比值

在影象處理中經常會遇到判斷兩個矩形是否相交,以及相交的比例的情況,下面是來自TLD演算法中原始碼的求法: float bbOverlap(const BoundingBox& box1,const BoundingBox& box2) { if (box

Spring事務的7傳播行為,4隔離級別

Spring事務的傳播行為和隔離級別[transaction behavior and isolated level] Spring中事務的定義:  一、Propagation  key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是

python判斷條線段是否相交

參考部落格https://www.cnblogs.com/wuwangchuxin0924/p/6218494.html https://blog.csdn.net/s0rose/article/details/78831570 a = [1,1] b = [2,2] c = [3,2] d

判斷條線段/直線相交,並求交點

一.向量基本知識     因為後面的計算需要一些向量的基本知識,這裡只是簡單的列舉如下,如果需要更加詳細的資訊,可以自行搜尋wikipedia或google。 1.向量的概念:如果一條線段的端點是有次序之分的,我們把這種線段成為有向線段(directed segment)。如果有向線段p1p2的起點p1在

WebStorm下將vue的程式碼縮排由2空格改為4空格

已經找過解決方案但設定後無效的,可直接看文章的最後一句。 最近剛接觸vue,發現按tab縮排程式碼時縮排一直是2格而不是4格,檢查了一下WebStorm的配置: File > Settings

C++平面矩形相交判斷

最近開發小遊戲需要一個簡單的碰撞檢測,因為用的是自定義的Rect類,雖然這個判斷方法很簡單,但是百度看了很多人的寫法程式碼量都相當的大。 當然搜到的結果都不是我想要的,於是只有自己寫啦。兩個矩形(不

java判斷單鏈表是否相交

fast n) detail 無環 etl ++ code 數據 enter 轉載於:http://blog.csdn.net/happymatilian/article/details/47811161 思路: 鏈表分有環鏈表和無環鏈表,如果兩個鏈表存在相交

Overlapping rectangles判斷矩形是否重疊的問題 C++

nsis enter load upload second eno 兩個 top traints Given two rectangles, find if the given two rectangles overlap or not. A rectangle is de

js計算矩形相交

utf char Y軸 lang cli epo ava log function <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <

實現:判斷日期之間關系(相交,相離,重合),得到相交重合的天數以及計算日期相差的天數

數值 以及 c++ 日期類 OS 錯誤 表達 單位 有一個 package com.xiawei.repeatdays; import java.util.Date; /** * 判斷日期之間關系(相交,相離,重合),得到相交重合的天數 * */public class R

輸入兩個整數序列,第一序列表示棧的壓入順序,請判斷第二序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應

    輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應     import java

演算法練習05 判斷矩形是否重疊

題目(2018-11-20) 用一個物件的資料來表示一個矩形的位置和大小: { x: 100, y: 100, width: 150, height: 250 } 它表示一個寬為150高為250的矩形在頁面上的(100, 100)的位置。 請你完成一個函

判斷單鏈表是否相交,若相交,求節點(連結串列不帶環)

先理解一下題目的意思,單鏈表的相交和普通兩條線的相交一樣嗎? 所以當我們把其換成節點就可以變成下面這樣: 先判斷連結串列是否相交,我們可以運用兩個連結串列相交後就變成了一條連結串列這個特性來判斷,因為如果兩條連結串列相交,那麼這兩條連結串列的最後一個節點一定