2013-06-30 3 views
1

Я изучил это question и последовал за ответом на реализацию моей собственной версии на Java. Я думаю, что это близко ... но все же неверно. Не могли бы вы дать мне некоторое предложение об ошибке?Являются ли два прямоугольника перекрывающимися друг с другом?

Полный исходный код можно найти here:

// Determine if it is inside 
boolean isInside = ((r1x1 >= r2x1) && (r1x2 >= r2x2) 
     && (r1y1 >= r2y1) && (r1y2 <= r2y2)); 

// Determine if it is overlap 
boolean isOverLap = (!(r1x1 >= r2x2) && !(r1x2 <= r2x2) 
     && !(r1y2 >= r2y1) && !(r1y1 <= r2y2)); 

// Determine if it is NOT overlap 
boolean isNotOverLap = ((r1x1 >= r2x2) || (r1x2 <= r2x2) 
     || (r1y2 >= r2y1) || (r1y1 <= r2y2)); 

Согласно учебнику, я учусь, это должно быть: r2 overlap r1. Но мой выпуск программы r2 does not overlap r1.

Enter the r1's center x, y coordinates, width and height 
1 2 3 5.5 
Enter the r2's center x, y coordinates, width and height 
3 4 4.5 5 
Rectangle 1: (-0.50, 4.75), (2.50, -0.75) 
Rectangle 2: (0.75, 6.50), (5.25, 1.50) 
r2 does not overlap r1 
+6

Что не так с 'boolean isNotOverLap =! IsOverLap'? : P – arshajii

+1

Это загадка? Какая ошибка? –

+0

Заголовок редактировалось: '« Ты или нет, мой избиратель? »« –

ответ

3

Я думаю, что это должно быть

boolean isOverLap = (r1x1 < r2x2) && (r1x2 > r2x1) && (r1y1 < r2y2) && (r1y2 > r2y1); 

(легче читать без всех отрицания)

Вы можете увидеть это как противоположность из четырех случаев, каждый по своей собственной гарантии, что перекрытие не может произойти:

boolean isNonOverLap = (r1x1 >= r2x2) || (r1x2 <= r2x1) || (r1y1 >= r2y2) || (r1y2 <= r2y1); 
0

Первая строка содержит ошибку в (r1x2 >= r2x2):

Правильным должно быть:

boolean isInside = ((r1x1 >= r2x1) && (r1x2 <= r2x2) && (r1y1 >= r2y1) && (r1y2 <= r2y2)); 
+0

Спасибо за указание, но я просил «isOverLap» и «isNotOverLap» ... – George

0

два rectagles будут перекрывающие .... когда соответствующие диагонали, имеющие одинаковую длину

, например:

R1: (x1, y1), (х2, у2), (х3, у3), (x4, у4)

R2: (а1, b1), (а2 , b2), (a3, b3), (a4, b4)

таким образом это должно быть правдой:

расстояние ((x1, y1), (х3, у3)) = расстояние ((а1, b1), (а3, b3))

, а также

Расстояние ((x2, y2), (x4, y4)) = расстояние ((a2, b2), (a4, b4))

2

Вот мое решение, я также проверил его.

package small_Progs; 

class Point { 
    int x, y; 

    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

class Rectangle { 
    Point lt, lb, rt, rb; 

    Rectangle(Point lt, Point lb, Point rt, Point rb) { 
     this.lt = lt; 
     this.lb = lb; 
     this.rt = rt; 
     this.rb = rb; 
    } 
} 

public class OverlappingRectagles { 

    public static void main(String arg[]) { 
     Point lt1 = new Point(3, 8); 
     Point lb1 = new Point(3, 5); 
     Point rt1 = new Point(6, 8); 
     Point rb1 = new Point(6, 5); 

     Point lt2 = new Point(5, 6); 
     Point lb2 = new Point(5, 3); 
     Point rt2 = new Point(9, 6); 
     Point rb2 = new Point(9, 3); 

     Point lt3 = new Point(3, 7); 
     Point lb3 = new Point(3, 6); 
     Point rt3 = new Point(5, 7); 
     Point rb3 = new Point(5, 6); 

     Point lt4 = new Point(1, 2); 
     Point lb4 = new Point(1, 1); 
     Point rt4 = new Point(2, 2); 
     Point rb4 = new Point(2, 1); 

     Rectangle r1 = new Rectangle(lt1, lb1, rt1, rb1); 
     Rectangle r2 = new Rectangle(lt2, lb2, rt2, rb2); 
     Rectangle r3 = new Rectangle(lt3, lb3, rt3, rb3); 
     Rectangle r4 = new Rectangle(lt4, lb4, rt4, rb4); 

     OverlappingRectagles obj = new OverlappingRectagles(); 
     obj.isOverLapping(r1, r2); 
     obj.isOverLapping(r1, r3); 
     obj.isOverLapping(r1, r4); 

    } 

    private void isOverLapping(Rectangle rect1, Rectangle rect2) { 
     Point l1 = rect1.lt; 
     Point l2 = rect2.lt; 

     Point r1 = rect1.rb; 
     Point r2 = rect2.rb; 

     if (l1.y < l2.y || l2.y < r1.y) { 
      System.out.println("Not Overlapping"); 
     } else if (l1.x > r2.x || l2.x > r1.x) { 
      System.out.println("Not Overlapping"); 
     } else { 
      if ((l1.y > r2.y && l2.y > r1.y) || (l2.y > r1.y && r2.y > r2.y)) { 
       System.out.println("Overlapping"); 
      } else { 
       System.out.println("Not Overlapping"); 
      } 

     } 

    } 
} 
Смежные вопросы