1. 程式人生 > >快速判斷兩個矩形是否相交

快速判斷兩個矩形是否相交

兩個矩形之間的位置關係無外乎圖中的5中case.


難道我們要每個case都要判斷一邊,然後決定是否相交?

其實是有通用方法的。

如果兩個矩形相交,那麼矩形A B的中心點和矩形的邊長是有一定關係的。

Case 2345中,兩個中心點間的距離肯定小於AB邊長和的一半。

Case 1中就像等了。

設A[x01,y01,x02,y02]  B[x11,y11,x12,y12].

矩形A和矩形B物理中心點X方向的距離為Lx:abs( (x01+x02)/2 – (x11+x12) /2)

矩形A和矩形B物理中心點Y方向的距離為Ly:abs( (y01+y02)/2 – (y11+y12) /2)

矩形A和矩形B X方向的邊長為 Sax:abs(x01-x02)  Sbx: abs(x11-x12)

矩形A和矩形B Y方向的邊長為 Say:abs(y01-y02)  Sby: abs(y11-y12)

如果AB相交,則滿足下列關係:

Lx <= (Sax + Sbx)/2 && Ly <=(Say+ Sby)/2

C code:

static uint8_t is_rect_intersect(int x01, int x02, int y01, int y02,
	int x11, int x12, int y11, int y12)
{
	int zx = abs(x01 + x02 -x11 - x12);
	int x  = abs(x01 - x02) + abs(x11 - x12);
	int zy = abs(y01 + y02 - y11 - y12);
	int y  = abs(y01 - y02) + abs(y11 - y12);
	if(zx <= x && zy <= y)
		return 1;
	else
		return 0;
}
針對此問題,matlab中還有增強版的實現函式rectint(A,B) 返回交集的面積。有興趣的可以單步除錯下,看看實現方法。

Ref:

http://www.cnblogs.com/avril/archive/2012/11/13/2767577.html

相關推薦

快速判斷矩形是否相交

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

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

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

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

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

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

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

判斷矩形是否相交演算法

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

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

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

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

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

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

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

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

判斷矩形是否有重疊

今天筆試遇到這個題目,原來是影象中的問題:判斷影象中檢測到的兩個人臉框矩形是否有重疊部分,並計算重疊大小,從而確認是否為同一個人臉。 直接判斷的話,情況有點多,比如: 這樣程式碼就比較繁瑣了。 如果是先考慮沒有重疊呢? 如上圖所示,沒有重疊的話,可以分為四種

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

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

power oj 2823: 遲早被炸了的炸雞(在座標軸裡判斷矩形是否重合)

Description  悲憐家養了一隻非常皮的小三花貓炸雞,花炸雞同學在悲憐去實驗室學習的時候,上天入地無所不能,經常損壞傢俱,因為悲憐學長剛剛搬了新家,買了很多東西,地上堆了很多紙箱子,有一天當悲憐畢業的時候,他還想賣出去一些傢俱回血,所以包裝箱並不想扔掉,但是花炸雞同

如何判斷矩形是否有重疊部分?(某公司校園招聘筆試試題)

#include<iostream> #include<cmath> using namespace std; typedef struct rectangle {float centerX;float centerY;float width;float height; }Rectan

[cocos2d-x]判斷矩形是否有交叉區域

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

判斷線段是否相交

.net stream pri nbsp cstring mes using style 相交 判斷兩條直線是否相交有兩步: 1:快速排斥(可以篩除大部分) 2:跨立試驗(下

java判斷單鏈表是否相交

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

js計算矩形相交

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

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

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

判斷連結串列是否相交,若相交,求交點。(假設連結串列不帶環)

判斷是否相交 int IsCrossWithoutCircle(pList plist1, pList plist2) { pNode pTail1 = plist1; pNode pTail2 = plist2; if (pTail1 == NULL || pTai

六、判斷單向連結串列是否相交

判斷兩個單向連結串列是否相交,有兩種情況,一種是兩個不帶環的單向連結串列相交,一種是兩個帶環的單向連結串列相交。 情況1:兩個不帶環的單向連結串列相交 /*判斷兩個不帶環的單向連結串列是否相交。時間