首页 > 代码库 > 矩形重叠检测。

矩形重叠检测。

// 矩形重叠类型注释// CORNER_OVERLAP// --------------------// |                  |// |                  |// |        **********|**********// |        *         |         *// |        *         |         *// ---------*---------|         *//          *                   *//          *                   *//          *********************//  //  ANCHOR_OVERLAP//            ----//            |  |//            |  |//     *******|**|*******//     *	  |	 |		*//     *      |  |      *//     *      ----      *//     *                *//     ******************//   SAME_WIDTH_OVERLAP  //     |-----------------|//     |                 |//     ******************|//     |-----------------*//     *                 *//     *******************////     INSIDE_OVERLAP//   **********************//	 *                    *//   *     ---------      *//   *     |       |      *//   *     |       |      *//   *     ---------      *//   *                    *//   **********************   //   //     CROSS_OVERLAP//          -----//          |   |           //          |   |//     *****|***|******//     *    |   |     *//     *    |   |     *//     *****|***|******//          |   |  //          -----         typedef enum EM_RectOverlapType{	NO_OVERLAP,    CORNER_OVERLAP,	ANCHOR_OVERLAP,	SAME_WIDTH_OVERLAP,	INSIDE_OVERLAP,	CROSS_OVERLAP,	ERROR_OVERLAP,}EM_RectOverlapType;//判断Rect重叠的类型,判定方法//NO_OVERLAP:     重叠矩形面积为0 //CORNER_OVERLAP: 重叠矩形的一个角的两条边,与被判定矩形的一个角的两条边坐标一致(角的2条边)//SAME_WIDTH_OVERLAP: 两个矩形的横向坐标或者纵向坐标一致,并且重叠。//ANCHOR_OVERLAP: 重叠矩形的三条边与被判定矩形的三条边重叠(3个边)//INSIDE_OVERLAP: 重叠矩形与被判定矩形的其中之一完全重合(4个边)//CROSS_OVERLAP : 重叠矩形的平行的两条边与被判定矩形之一的对应两条边重叠,另两条边与另一个被判定矩形的对应的另两条边重叠(2对对应的两条边)//后三种的相同部分是都有平行的两条边重合,所以判定先重后三行开始EM_RectOverlapType JudgeOverlapTypeByTwoRect(const EM_RECT& firstRect,const EM_RECT& overlapRect){	if ( (overlapRect.left == firstRect.left) && (overlapRect.right==firstRect.right))//平行2条边	{		if ( (overlapRect.top == firstRect.top) )//3条边		{			if (overlapRect.bottom == firstRect.bottom)//4条边			{				return INSIDE_OVERLAP;			}			else			{				return ANCHOR_OVERLAP;			}		}		else if (overlapRect.bottom == firstRect.bottom)		{			if (overlapRect.top == firstRect.top)			{				return INSIDE_OVERLAP;			}			else			{				return ANCHOR_OVERLAP;			}		}		else		{			return SAME_WIDTH_OVERLAP;		}	}	else if ((overlapRect.top == firstRect.top) && (overlapRect.bottom == firstRect.bottom) )	{		return SAME_WIDTH_OVERLAP;	}	else 	{		return CORNER_OVERLAP;	}}EM_RectOverlapType JudgeOverlapType(const EM_RECT& firstRect,const EM_RECT& secondRect,const EM_RECT& overlapRect){	EM_RectOverlapType firstType = JudgeOverlapTypeByTwoRect(firstRect,overlapRect);	if (ERROR_OVERLAP != firstType)	{   	    return firstType;	}	else	{		EM_RectOverlapType secondType = JudgeOverlapTypeByTwoRect(secondRect,overlapRect); 		if (ERROR_OVERLAP != secondType)		{			return secondType;		}		else		{			return ERROR_OVERLAP;		}	}}EM_RectOverlapType GetRectOverlapType(const EM_RECT& firstRect,const EM_RECT& secondRect){	EM_RECT overlapRect = GetOverlapRect(firstRect,secondRect);	long overlapRectSize = GetEM_RECTSize(overlapRect);	if (overlapRectSize)	{		return JudgeOverlapType(firstRect,secondRect,overlapRect);	}	else	{		return NO_OVERLAP;	}}