i working on algorithm problem try determine whether 2 rectangles overlap each other.
assume l1
, r1
top-left , bottom-right of first rectangle, , l2
, r2
top left , bottom-right of second rectangle.
i determined easier first determine when rectangles don't overlap, , here rules:
l2.x >= r1.x // rectangle 2 right of rectangle 1 r2.x <= l1.x // rectangle 2 left of rectangle 1 r2.y <= l1.y // rectangle 2 top of rectangle 1 l2.y >= r1.y // rectangle 2 bottom of rectangle 1
so put together, take not
of this, means whenever conditions not overlapping satisfied, rectangles overlapping.
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; }
i feel i'm not doing correctly. while drew out on piece of paper solve problem, feel missing something. did wrong?
test cases:
// rectangle 2 two x-units away 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"); }
output:
overlapping
looking @ answer, quite close, seems flipped top/bottom conditions: http://www.geeksforgeeks.org/find-two-rectangles-overlap/
your criteria right. problem boolean negation. not (a or b) == (not a) , (not b)
. want not (out on right || out on left || out on top || out on bottom)
. translates
(not (out on right)) , (not (out on left)) ...
that is,
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; }
which might have struck long in first place. remember java has short-circuit evaluation &&
operator , stop earlier returning "non-overlapping" in order return "overlapping" (true) 4 conditions need evaluated , fulfilled.
Comments
Post a Comment