我正在研究一个算法问题,试图确定两个矩形是否相互重叠。
假设L1
和R1
是第一个矩形的左上角和右下角,L2
和R2
是左上角和右下角的第二个矩形。
我确定首先确定矩形何时不重叠更容易,这是我的规则:
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/
答案 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;
}