關於判斷兩個矩陣相交的一點想法

OpenSoucre發表於2013-11-19

今天在閱讀chipmunk2D原始碼時,在cpBB.h中看到了一個判讀矩陣相交的函式

static inline cpBool cpBBIntersects(const cpBB a, const cpBB b)
{
    return (a.l <= b.r && b.l <= a.r && a.b <= b.t && b.b <= a.t);
}

將其轉換為熟悉的c++程式碼後:

typedef struct{
    double     l;      //left
    double     b;     //bottom
    double     r;     //right
    double     t;    //top
} CRect;

bool CRectIntersects(const CRect a, const CRect b){
    return (a.l <= b.r && b.l <= a.r && a.b <= b.t && b.b <= a.t);
}    

兩個矩陣相交,兩個矩陣的必定部分疊在一起,將兩個矩陣的left,bottom,top,right互相限制就行,上面函式就是兩個矩陣互相限制。

另一個方法就是從反面考慮,考慮什麼情況下矩陣不相交,程式碼如下:

bool  CRectIntersects(const CRect a, const CRect  b){
  return !(a.r < b.l || a.r > b.l || a.t < b.b || a.b > b.t);          
}

還有一種方法就是根據兩個矩陣相交形成的矩陣判斷,

兩個矩陣相交的結果一定是一個矩陣,構成相交矩陣為CRect{newLeft,newBottom,newRight,newTop}

newLeft      = max(a.l,b.l)
newBottom    = max(a.t,b.t)
newRight     = min(a.r,b.r)
newTop       = min(a.t,b.t)

如果矩陣a與b不相交的話,則newLeft > newRight || newBottom > newTop,故判斷相交的函式為

bool  CRectIntersect(const CRect a, const CRect b){
     newLeft        = max(a.l,b.l);
    newBottom    = max(a.t,b.t);
    newRight       = min(a.r,b.r);
    newTop         = min(a.t,b.t);  
    return !(newLeft > newRight || newBottom > newTop)      
}

 

 

 

相關文章