分享一个小方法,判断同一坐标系下两个矩形是否有重合

最近项目中遇到一个问题,需要判断两个矩形是否有重合,以及重合的面积是否超过指定值。
其实是一个很简单的数学问题,这里发出来给大家分享一下。

先说思路,**同一坐标系下**,判断两个矩形是否有重合,有以下三种情况:
1、两个矩形,其中一个包含在另一个之中,这种肯定是重合的;
2、两个矩形,完全不重合,即没有交叉重合的区域;
3、两个矩形,有部分重合在一起,形成一个新的重合矩形。

我们这里说一下第三种情况
矩形rect1和rect2交叉,形成新的重合矩形rect3,根据图形可以看出,
矩形rect3的Left=rect2.Left,Top=rect2.Top,Right=rect1.Right,Bottom=rect1.Bottom。

在这里插入图片描述

			  /// <summary>
        /// 判断两个矩形是否重合(重合部分大于较小矩形面积的一定比例)
        /// </summary>
        /// <param name="rect1">矩形1</param>
        /// <param name="rect2">矩形2</param>
        /// <param name="ratio">重合矩形面积与较小矩形面积的比率(百分比)</param>
        /// <returns></returns>
        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;//两个矩形较大的left值
            int maxTop = rect1.Top > rect2.Top ? rect1.Top : rect2.Top;//两个矩形较大的top值
            int minRight = rect1.Right < rect2.Right ? rect1.Right : rect2.Right;//两个矩形较小的right值
            int minBottom = rect1.Bottom < rect2.Bottom ? rect1.Bottom : rect2.Bottom;//两个矩形较小的bottom值

            //如果两个矩形有重合,初始化一个新的重合部分矩形
            int newRectLeft = 0, newRectTop = 0, newRectWidth = 0, newRectHeight = 0;
            //如果有重合部分
            newRectLeft = maxLeft;//重合矩形的左上角X坐标即Left=偏右侧矩形的X坐标即Left
            newRectTop = maxTop;//重合矩形的左上角Y坐标即Top=偏下侧矩形的Y坐标即Top
            newRectWidth = minRight - maxLeft;//重合矩形的宽度=偏左侧矩形的Right-偏右侧矩形的Left
            newRectHeight = minBottom - maxTop;//重合矩形的高度=偏上侧矩形的Bottom-偏右侧矩形的Top

            //如果新矩形的宽高均大于0,则证明重合部分存在
            if (newRectWidth > 0 && newRectHeight > 0)
            {
            	//这里是为了判断重合矩形的面积与面积较小一个矩形面积的比率,如果超过设定的比例就返回true
                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;
        }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值