2015-09-25 2 views
-1

Я работаю над проблемой алгоритма, чтобы попытаться определить, перекрываются ли два прямоугольника друг с другом.Определить, перекрываются ли два прямоугольника

Предположим 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; 
} 

Я чувствую, что я делаю это неправильно. Пока я все нарисовал на листе бумаги, чтобы решить эту проблему, я чувствую, что у меня что-то не хватает. Что я сделал не так?

Test Cases:

// 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

испытаны ли вы его? – sstan

+0

@sstan да, пожалуйста, проверьте править – theGreenCabbage

+1

Есть ли причина, по которой вы не используете класс Polygon и просто вызываете Polygon.intersects (Rectangle2D)? – Kylar

ответ

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 для оператора && и остановит более раннее возвращение «неперекрывающихся», но для возврата «перекрытия» (true) все четыре условия должны быть оценены и выполнены.

+0

сбой в случае точки l1 = {1,4}, r1 = {5, 4}; Точка l2 = {1,4}, r2 = {3,4}; – JerryGoyal

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-statement проверяет, находится ли прямоугольник слева/справа друг от друга. Если они есть, то они не перекрываются.

Второй оператор if проверяет, находится ли прямоугольник сверху/снизу. Если они есть, то они не перекрываются.

0

Я думаю, мы должны & & вместо ||, пожалуйста, попробуйте ниже фрагмент кода

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; 
} 
Смежные вопросы