用来检测两个矩形是否碰撞并计算重合的区域(碰撞检测)
// 此代码必须在C++编译器上才能正常编译// 碰撞临时结构
typedef struct tagHitStruct
{
float Value;
char Flag;
}HITSTRUCT;
// 交换
#define SWAP(X, Y) { t = List[X]; List[X] = List[Y]; List[Y] = t; }
// 对4个元素排序
void Sort4(HITSTRUCT *List)
{
HITSTRUCT t;
if(List[0].Value > List[2].Value) SWAP(0, 2);
if(List[1].Value > List[3].Value) SWAP(1, 3);
if(List[0].Value > List[1].Value) SWAP(0, 1);
if(List[2].Value > List[3].Value) SWAP(2, 3);
if(List[1].Value > List[2].Value) SWAP(1, 2);
}
#undef SWAP
// 碰撞检测
BOOL HitTest(RECT *rc1, RECT *rc2, RECT *pOutRC)
{
RECT tmpRc;
// 横向检测
HITSTRUCT hsH[4] = {rc1->left, 1, rc1->right, 1, rc2->left, 2, rc2->right, 2};
Sort4(hsH);
if(hsH[0].Flag == hsH[1].Flag) return FALSE;
// 纵向检测
HITSTRUCT hsV[4] = {rc1->top, 1, rc1->bottom, 1, rc2->top, 2, rc2->bottom, 2};
Sort4(hsV);
if(hsV[0].Flag == hsV[1].Flag) return FALSE;
// 保存碰撞的重合区域
tmpRc.left = hsH[1].Value;
tmpRc.right = hsH[2].Value;
tmpRc.top = hsV[1].Value;
tmpRc.bottom = hsV[2].Value;
if(pOutRC) *pOutRC = tmpRc;
return TRUE;
}