判断两矩形是否相交

判断两矩形是否相交,因若矩形相交时,在X轴方向和Y轴方向必然存在重叠的部分,因此可将其转化为两条直线是否重叠的问题上。
假设矩形的表示方法为:

class Rectangle
{
      int x;
      int y;
      int width;
      int height;
};

x,y为矩形的位置点,width表示长,height表示宽。width与height可为正负数。
width>0,height>0时,点(x,y)在矩形的左下角;
width>0,height<0时,点(x,y)在矩形的左上角;
width<0,height>0时,点(x,y)在矩形的右下角;
width<0,height<0时,点(x,y)在矩形的右上角;

判断是否矩形R1,R2是否相交可转化为X轴与Y轴的直线是否相交,判断两直线是否相交的思路是相交部分的直线长度必然>0:
bool isCross(const Rectangle &r1,const Rectangle &r2)
{
      int w;
      int h;

      w=abs(r1.width+r2.width)-abs(r1.x-r2.x)-abs(r1.x+r1.width-(r2.x+r2.width);
      w/=2;
      h=abs(r1.height+r2.height)-abs(r1.y-r2.y)-abs(r1.y+r1.height-(r2.y+r2.height));
      h/=2;

      if(w<=0||h<=0)
          return false;

      return true;
}
上述方法,可顺便求出相交部分的width和height,但其正负号以及相交矩形的位置点(x,y)则需再另行判断,即上述方法不管矩形以什么形式来表示均适用。

相交矩形位置点(x,y)的确定与矩形的表示方法相关,大体的思路为:将其转化为X轴与Y轴直线相交直线起点的确定(前提是两矩形确定为相交)。
先将两直线的起点与终点进行排序(排序为日常的排序,非绝对值后再排序),若位置点在矩形的左边,取排序后的第2点为相交直线的起点;若位置点在矩形的右边,取排序后的第3点为相交直线的起点。
如在X轴方向上,直线ab,直线cd,若ab>0或cd>0时(位置点在左边),width为正,当a>c,x=a,当a<c,x=c;若ab<0或cd<0时(位置点在右边),width为负,当b>d,x=b,当b<d,x=d;同样在Y轴方向上也是如此判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值