计算两个矩形是否相交以及相交的矩形

来源:互联网 发布:淘宝卖家怎么发布宝贝 编辑:程序博客网 时间:2024/05/01 20:58

最近在开发的时候遇到一个问题,就是要判断在同一个直角坐标系下,两个边与坐标轴平行的矩形是否相交。

(应用到三维坐标系上也是同样的道理,就是先降维,再把条件&&起来,这里就不再赘述了)


在网上看到了很多解决方案,都是分情况讨论,虽然复杂度并不高,但是觉得代码量有点冗余。最后想到了如下算法能够判断出结果。


既然难以判断讨论相交关系,就直接判断不相交

显而易见的是,如果一个矩形在另一个矩形的上方/下方/左方/右方,那么俩个矩形一定不相交

我们设REC1的重心是P1(x1, y1),宽为W1,高为H1;REC2的重心是P2(x2, y2),宽为W2,高为H2

那么两个矩形重心的距离就是new Vector2 dis(x2 - x1, y2 - y1)

如果在x轴方向上重心距离小于两个矩形边长的和的一半,那么显然在x轴方向上它们相交,y轴同理

则:

if (((W1 + W2) / 2 >= dis.x) && ((H1 + H2) / 2 >= dis.y)) {

return true;

}

至于为什么用大于等于,是因为在我的应用中,边重合也算是相交


说完了如何判断相交,再说一下判断相交之后的矩形

我们可以想象到的是,通过重心距离依然可以判断相交区域


那么相交区域在X轴上的长就是 min((W1 + W2) / 2 - dis.x, min(W1, W2))

为什么要和min(W1, W2)比较呢,这是考虑包含的情况,这时相交区域总不能比矩形本身还大吧

Y轴同理


相交区域的边长求出来了,怎么求相交区域的顶点啥的呢?这里就不说了,按照这个思路大家自己也想想


以上,我自己也知道排版一塌糊涂,等有时间我学下Markdown再好好弄弄,这里想说声抱歉

0 0
原创粉丝点击