关闭

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

标签: 计算图形学算法
164人阅读 评论(0) 收藏 举报
分类:

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

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


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


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

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

我们设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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1010次
    • 积分:86
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档