推断矩形订交以及求出订交的地区

题目:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2)。
(1)设想一个算法,肯定两个矩形是不是订交(即有堆叠地区)
(2)假如两个矩形订交,设想一个算法,求出订交的地区矩形

(1) 关于这个题目,平常的思绪就是推断一个矩形的四个极点是不是在另一个矩形的地区内。这个思绪最简朴,然则效力不高,而且存在毛病,毛病在那里,下面剖析一 下。
《推断矩形订交以及求出订交的地区》

如上图,把矩形的订交(地区堆叠)分红三种(能够也有其他分别),关于第三种状况,如图中的(3),两个矩形订交,但并不存在一个矩形的极点在另一个矩形 内部。所以那种思绪存在一个毛病,关于这类状况的订交则搜检不出。

仔细视察上图,想到另一种思绪,那就是推断两个矩形的中间坐标的水温和垂直距离,只需这两个值满足某种前提就能够订交。
矩形A的宽 Wa = Xa2-Xa1 高 Ha = Ya2-Ya1
矩形B的宽 Wb = Xb2-Xb1 高 Hb = Yb2-Yb1
矩形A的中间坐标 (Xa3,Ya3) = ( (Xa2+Xa1)/2 ,(Ya2+Ya1)/2 )
矩形B的中间坐标 (Xb3,Yb3) = ( (Xb2+Xb1)/2 ,(Yb2+Yb1)/2 )
所以只需同时满足下面两个式子,就能够申明两个矩形订交。
1) | Xb3-Xa3 | <= Wa/2 + Wb/2
2) | Yb3-Ya3 | <= Ha/2 + Hb/2
即:
| Xb2+Xb1-Xa2-Xa1 | <= Xa2-Xa1 + Xb2-Xb1
| Yb2+Yb1-Ya2-Ya1 | <=Y a2-Ya1 + Yb2-Yb1
附上js完成

intersect = function(rect1, rect2) {
    var half1Width = rect1.width / 2,
        half1Height = rect1.height / 2,
        half2Width = rect2.width / 2,
        half2Height = rect2.height / 2,
        cen1 = {
            x: rect1.x + half1Width,
            y: rect1.y + half1Height
        },
        cen2 = {
            x: rect2.x + half2Width,
            y: rect2.y + half2Height
        };

    return Math.abs(cen2.x - cen1.x) <= half1Width + half2Width &&
        Math.abs(cen2.y - cen1.y) <= half1Height + half2Height;
};

(2) 关于这个题目,假定两个矩形订交,设订交以后的矩形为C,且矩形C的左上角坐标为(Xc1,Yc1),右下角坐标为(Xc2,Yc2),经由视察上图,很 明显能够获得:
Xc1 = max(Xa1,Xb1)
Yc1 = max(Ya1,Yb1)
Xc2 = min(Xa2,Xb2)
Yc2 = min(Ya2,Yb2)
如许就求出了矩形的订交地区。
别的,注意到在不假定矩形订交的前提下,定义(Xc1,Yc1),(Xc2,Yc2),且Xc1,Yc1,Xc2,Yc2的值由上面四个式子得出。如许, 能够根据Xc1,Yc1,Xc2,Yc2的值来推断矩形订交。
Xc1,Yc1,Xc2,Yc2只需同时满足下面两个式子,就能够申明两个矩形订交。
3) Xc1 <= Xc2
4) Yc1 <= Yc2
即:
max(Xa1,Xb1) <= min(Xa2,Xb2)
max(Ya1,Yb1) <= min(Ya2,Yb2)

宣传下我的区块治理框架Magix:https://github.com/thx/magix

迎接试用Magix、star与fork

    原文作者:行列
    原文地址: https://segmentfault.com/a/1190000006212588
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞