判断两矩形是否相交

判断两矩形是否相交,因若矩形相交时,在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轴方向上也是如此判断。

### Matlab 中判断两个矩形是否相交 为了在 MATLAB 中检测两个矩形是否相交,可以利用内置函数 `rectint` 或者手动编写逻辑来完成这一任务。 #### 使用内置函数 rectint MATLAB 提供了一个名为 `rectint` 的内建函数用于计算两个矩形之间的交集面积。当返回的结果大于零时,则表示这两个矩形存在重叠部分;反之则说明它们之间不存在任何交叉区域[^4]。 ```matlab % 定义矩形 A B 的位置参数 (左下角坐标,度,度) posA = [xa1 ya1 widthA heightA]; posB = [xb1 yb1 widthB heightB]; % 计算并打印交集面积 intersectionArea = rectint(posA, posB); if intersectionArea > 0 disp('Rectangles intersect.'); else disp('No intersection found.'); end ``` #### 手动实现算法 如果不希望通过调用库函数的方式解决问题,也可以通过比较各个边界条件来自定义解决方案: - 如果一个矩形完全位于另一个矩形左侧、右侧、上方或下方,则二者不会发生碰撞; - 只要满足上述任一情况之外的情形就意味着发生了碰撞。 具体代码如下所示: ```matlab function result = doRectsIntersect(xa1,ya1,xa2,ya2, xb1,yb1,xb2,yb2) % 判断是否有任何一个矩形处于另一矩形的一侧 if xa2 < xb1 || xa1 > xb2 || ya2 < yb1 || ya1 > yb2 result = false; else result = true; end end % 调用自定义函数进行测试 result = doRectsIntersect(Xa1,Ya1,Xa2,Ya2, Xb1,Yb1,Xb2,Yb2); if result disp('Rectangles intersect.'); else disp('No intersection found.'); end ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值