最近项目中遇到一个问题,需要判断两个矩形是否有重合,以及重合的面积是否超过指定值。
其实是一个很简单的数学问题,这里发出来给大家分享一下。
先说思路,**同一坐标系下**,判断两个矩形是否有重合,有以下三种情况:
1、两个矩形,其中一个包含在另一个之中,这种肯定是重合的;
2、两个矩形,完全不重合,即没有交叉重合的区域;
3、两个矩形,有部分重合在一起,形成一个新的重合矩形。
我们这里说一下第三种情况
矩形rect1和rect2交叉,形成新的重合矩形rect3,根据图形可以看出,
矩形rect3的Left=rect2.Left,Top=rect2.Top,Right=rect1.Right,Bottom=rect1.Bottom。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a0d6d8104a9051b8389d4e14d03ff0a1.png#pic_center)
public static bool RectIsCoincide(Rectangle rect1, Rectangle rect2, int ratio)
{
if (rect1.Width <= 0 || rect1.Height <= 0 || rect2.Width <= 0 || rect2.Height <= 0)
return false;
if (rect1.Contains(rect2) || rect2.Contains(rect1))
return true;
int maxLeft = rect1.Left > rect2.Left ? rect1.Left : rect2.Left;
int maxTop = rect1.Top > rect2.Top ? rect1.Top : rect2.Top;
int minRight = rect1.Right < rect2.Right ? rect1.Right : rect2.Right;
int minBottom = rect1.Bottom < rect2.Bottom ? rect1.Bottom : rect2.Bottom;
int newRectLeft = 0, newRectTop = 0, newRectWidth = 0, newRectHeight = 0;
newRectLeft = maxLeft;
newRectTop = maxTop;
newRectWidth = minRight - maxLeft;
newRectHeight = minBottom - maxTop;
if (newRectWidth > 0 && newRectHeight > 0)
{
int minArea = rect1.Width * rect1.Height < rect2.Width * rect2.Height ? rect1.Width * rect1.Height : rect2.Width * rect2.Height;
if (newRectWidth * newRectHeight > ((float)minArea * ratio / 100))
return true;
}
return false;
}