矩形重叠检测。

// 矩形重叠类型注释
// 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;
	}
}

  

矩形重叠检测。

时间: 2024-11-05 10:13:43

矩形重叠检测。的相关文章

重叠检测----凸边形

很多人都叫他  分离坐标轴方法 理论源自  凸集分离定理 wikipedia 上 Hyperplane separation theorem 他的内容是,如果能找到一条轴,使得两个物体在该轴上的投影互不重叠,那么这两个物体就是不相交的. 重点是如何找到这条轴. 以2D图形的每条边做为分离轴,使2个图形在分离轴的法线上投影,如上图,只要其中有一次 两图形投影不重叠,就可证明两图形不是重叠的. 关于两长方形的重叠检测: 依上理论 为每条边做分离轴,由于长方形为AABB,所以只要检测4条边. 由于最后

paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]

Haar-like矩形遍历检测窗口演示Matlab源代码 clc; clear; close all; % Haar-like特征矩形计算 board = 24 % 检测窗口宽度 num = 24 % 检测窗口分划数 show = 1; % 1为作图 time = 0.001; % 作图间隔 %% if mod(board,num)~=0 error('检测窗口宽度必须是分划数的整数倍') else delta = board/num % 滑动步进值 end %% Haar特征1:左白,右黑,(

[Swift]LeetCode836. 矩形重叠 | Rectangle Overlap

A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bottom-left corner, and (x2, y2) are the coordinates of its top-right corner. Two rectangles overlap if the area of their intersection is positive.  To b

LeetCode 29. 矩形重叠 反向思维

题目描述 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角或边接触的两个矩形不构成重叠. 给出两个矩形,判断它们是否重叠并返回结果. 示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true 示例 2: 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false 提示: 两个矩

Leetcode 836. 矩形重叠

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角或边接触的两个矩形不构成重叠. 给出两个矩形,判断它们是否重叠并返回结果. 示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true 示例 2: 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false 提示: 两个矩形 rec

836. 矩形重叠

题目: 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角或边接触的两个矩形不构成重叠. 给出两个矩形,判断它们是否重叠并返回结果. 示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true 示例 2: 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false 提示: 两个矩形

矩形重叠

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12517261.html 矩形重叠(43min) 题目链接:https://leetcode-cn.com/problems/rectangle-overlap/ 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角或边接触的两个矩形不构成重叠. 给出两个矩形,判断它们

leetcode 签到 836. 矩形重叠

836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角或边接触的两个矩形不构成重叠. 给出两个矩形,判断它们是否重叠并返回结果. 示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true 示例 2: 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false 提示

矩形重叠判断

突然想到一个很有意思的问题,就是怎么判断两个矩形是否重叠? 我想到的算法是,先计算不重叠情况,再取反即可! 不重叠情况 蓝色矩形在黑色矩形的四周,这就是不重叠的情况.转换成坐标就是,蓝色矩形的 Xmin>x2 || Xmax<x1 || Ymin>y2 || Ymax<y1 可得重叠公式为: !(Xmin>x2 || Xmax<x1 || Ymin>y2 || Ymax<y1)