今天在閱讀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) }