确定两个矩形是否重叠

时间:2015-09-25 18:46:12

标签: java algorithm

我正在研究一个算法问题,试图确定两个矩形是否相互重叠。

假设L1R1是第一个矩形的左上角和右下角,L2R2是左上角和右下角的第二个矩形。

我确定首先确定矩形何时不重叠更容易,这是我的规则:

L2.x >= R1.x // rectangle 2 is right of rectangle 1

R2.x <= L1.x // rectangle 2 is left of rectangle 1

R2.y <= L1.y // rectangle 2 is top of rectangle 1

L2.y >= R1.y // rectangle 2 is bottom of rectangle 1

因此,我们采用not,这意味着只要满足不重叠的条件,矩形就会重叠。

public static boolean isOverlap(L1, R1, L2, R2) {
    if(!(L2.x >= R1.x) || !(R2.x <= L1.x) || !(R2.y <= L1.y) || !(L2.y >= R1.y)) {
        return true;
    }
    return false;
}

我觉得我没有正确地做到这一点。虽然我把一切都画在一张纸上以解决这个问题,但我觉得我错过了一些东西。我做错了什么?

测试案例:

    // Rectangle 2 is two x-units away from Rectangle 1
    // Should not overlap
    Point L1 = new Point(0, 0);
    Point R1 = new Point(2, 2);

    Point L2 = new Point(4, 0);
    Point R2 = new Point(6, 2);

    if(isOverlap(L1, R1, L2, R2)) {
        System.out.println("Overlapping");
    } else {
        System.out.println("Not overlapping");
    }

输出:

Overlapping

看看这个答案,我非常接近,但似乎我翻了顶/下条件:http://www.geeksforgeeks.org/find-two-rectangles-overlap/

3 个答案:

答案 0 :(得分:3)

您的标准是对的。问题在于布尔否定。 NOT (A OR B) == (NOT A) AND (NOT B)。所以你想做  NOT (out on right || out on left || out on top || out on bottom)。 这转化为

(NOT (out on right)) AND (NOT (out on left)) ...

即,

public static boolean isOverlap(L1, R1, L2, R2) {
  if(L2.x < R1.x && R2.x > L1.x && R2.y > L1.y && L2.y < R1.y) {
    return true;
  }
  return false;
}

这可能会让你觉得太长了。请记住,Java &&运算符有short-circuit evaluation,并且会在之前停止返回&#34;非重叠&#34;但为了回归&#34;重叠&#34; (true)所有四个条件都需要进行评估和实现。

答案 1 :(得分:0)

我想我想出来了..

public static boolean isOverlap(Point L1, Point R1, Point L2, Point R2) {
    // Check whether rectangle is left or right of each other
    // If it is, then it is not overlapping
    if((L2.x >= R1.x) || (R2.x <= L1.x)) {
        return false;
    }

    // Check whether the rectangle is top or bottom of each other
    // If it is, then it is not overlapping
    if((R2.y <= L1.y) || (L2.y >= R1.y)) {
        return false;
    }
    return true;
}

我基本上拆开了四个条件并将它们分成两个if语句。第一个if语句检查矩形是否相互左/右。如果是,则它们不会重叠。

第二个if语句检查矩形是否是彼此的顶部/底部。如果是,则它们不重叠。

答案 2 :(得分:0)

我认为,我们应该&amp;&amp;而不是||,请尝试下面的代码段

public static boolean isOverlap(Point L1, Point R1, Point L2, Point R2) {
    if((!(L2.x >= R1.x) && !(R2.x <= L1.x)) && (!(R2.y <= L1.y) && !(L2.y >= R1.y))) {
        return true;
    }
    return false;
}