如何判断两个矩形是否相交

如果两个矩形相交,则必然存在线条交叉,而能交叉的线条只有横线和竖线,两根横线或两根竖线都不可能交叉。所以,这个问题就转化成寻找是否存在交叉的横线与竖线。

  另外,A线与B线交叉等价于B线与A线交叉,所以,只要写一个函数就足够用了,多调用几次,反正计算机是专门做简单而又烦琐的工作的。

  下面是这个函数:判断一条横线和一条竖线是否交叉。该函数的参数分别是:横线左、横线右,横线Y,竖线上,竖线下,竖线X。

bool CrossLine(left, right, y, top, bottom, x)

{

 //判断一根横线和一根竖线是否交叉

 //横线有三个参数:left, right和y

 //竖线有三个参数:top, bottom和x

 return (top < y) && (bottom > y)

  && (left < x) && (right > x);

}

  下面是判断两个矩形是否相交的函数,把同一个函数多调用几篇就OK了。

bool CrossRect(CRect &r1, CRect &r2)

{

 //判断两个矩形是否相交,

 //从一个矩形中取出一条横线,与另一矩形中的一条竖线判断是否交叉

 return CrossLine(r1.x1, r1.x2, r1.y1, r2.y1, r2.y2, r2.x1)

   || CrossLine(r1.x1, r1.x2, r1.y1, r2.y1, r2.y2, r2.x2)

   || CrossLine(r1.x1, r1.x2, r1.y2, r2.y1, r2.y2, r2.x1)

   || CrossLine(r1.x1, r1.x2, r1.y2, r2.y1, r2.y2, r2.x2)

   || CrossLine(r2.x1, r2.x2, r2.y1, r1.y1, r1.y2, r1.x1)

   || CrossLine(r2.x1, r2.x2, r2.y1, r1.y1, r1.y2, r1.x2)

   || CrossLine(r2.x1, r2.x2, r2.y2, r1.y1, r1.y2, r1.x1)

   || CrossLine(r2.x1, r2.x2, r2.y2, r1.y1, r1.y2, r1.x2);

}


另一个算法:

两个矩形相交的条件:两个矩形的重心距离在X和Y轴上都小于两个矩形长或宽的一半之和.这样,分两次判断一下就行了.

bool CrossLine(Rect r1,RECT r2)

{

if(abs((r1.x1+r1.x2)/2-(r2.x1+r2.x2)/2)<((r1.x2+r2.x2-r1.x1-r2.x1)/2) && abs((r1.y1+r1.y2)/2-(r2.y1+r2.y2)/2)<((r1.y2+r2.y2-r1.y1-r2.y1)/2))

return true;

return false;

}

即:

 l:left   t:top   w:width   h:height   

  BOOL   isInterset(l1,t1,w1,h1,   l2,t2,w2,h2)   

  {   

        if(   math.abs(l1+w1/2-l2-w2/2)<=(w1+w2)/2   &&   Math.abs(t1+h1/2-t2-h2/2)<=   (h1+h2)/2)   

        {   

                return   TRUE;   

        }   

        else   

        {   

              return   FALSE;   

        }   

  }   

 

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahushen

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值