2015-12-19 3 views
2

В настоящее время я пытаюсь создать небольшой инструмент создания привязки Entity-Relationship-Modell для баз данных. Чтобы избежать ошибок, я стараюсь, чтобы прямоугольники не перекрывались с другим прямоугольником.Предотвращение перекрытия из прямоугольников

У меня большая часть моего кода работает, и он обнаруживает почти каждый сговор, но в одном случае я все еще могу пересекать их, и я не знаю, как исправить эту ошибку.

Проблема в том, что она будет выглядеть только на прямоугольнике не на обоих. Но я действительно не знаю, как перехватить этот случай.

Странным мне, что моя Debug линия

System.out.println("still intersects?"); 

никогда не срабатывает. Может кто-нибудь помочь мне в этой ошибке?

Image to the error in my Colision

Функция срабатывает каждый раз, когда я переместить прямоугольник. Атрибут Selected является булевым, который говорит мне, какой Rectangle я двигаюсь. Затем я проверяю, на какой стороне он перекрывается и возвращается в прежнее положение.

boolean Move(Point point) { 
    boolean moved = false; 
    boolean foundone = false; 
    for (ERMRectangle rectangle : Rectangles) { 
     if (rectangle.selected) { 
      foundone = true; 
      moved = true; 
      //calculated new Rectangle after Move 
      Rectangle Temp = new Rectangle(); 
      Temp.x = point.x + rectangle.click.x; 
      Temp.width = rectangle.position.width; 
      Temp.height = rectangle.position.height; 
      Temp.y = point.y + rectangle.click.y; 
      for (ERMRectangle rectangle2 : Rectangles) { 
       if (rectangle != rectangle2 && rectangle2.position.intersects(Temp))//prevent overlapping 
       { 
        Rectangle intersection = rectangle2.position.intersection(Temp); 

        if (intersection.height > intersection.width) { 

         Temp.x = rectangle2.position.x - rectangle2.position.width; 
         if (intersection.x != rectangle2.position.x) { 
          Temp.x = rectangle2.position.x + rectangle2.position.width; 
         } 

        } else { 
         Temp.y = rectangle2.position.y - rectangle2.position.height; 
         if (intersection.y != rectangle2.position.y) { 
          Temp.y = rectangle2.position.y + rectangle2.position.height; 
         } 

        } 

       } 
       if(rectangle != rectangle2 && rectangle2.position.intersects(Temp)) 
       { 
        System.out.println("still intersects?"); 
       } 
      } 

      rectangle.position = Temp; 
     } 
    } 

    return moved; 
} 

ERMRectangle класс:

import java.awt.Rectangle; 

public class ERMRectangle { 
    public Rectangle position; 
    public boolean selected; 
    public Point click; 
} 

Edit: я разрешил его, добавив еще один цикл в моей Methode, который проверяет, если он все еще interselects прямоугольник и возвращает оба х и у cordinnates.

+0

Что такое ERM? (Управление рисками предприятия?) Каковы объекты и методы класса ERMRectangle? Это пользовательский класс, который вы создали, или библиотека, полученная из других источников? Что такое код в 'ERMRectangle.position.intersects()'? – zipzit

+0

его из библиотеки java.awt.Прямоугольник –

+0

@DamianGalli Взгляните на мое решение и дайте мне знать результат. – user3437460

ответ

0

Я ответил им самим: Я разрешил его, добавив еще один цикл в мой метод, который проверяет, все ли он по-прежнему перекрещивает прямоугольник и возвращает х и у кординанов. Hackish и уродливый, но он работает.

 for (ERMRectangle rectangle2 : Rectangles) { 
       if (rectangle != rectangle2 && rectangle2.position.intersects(Temp))//prevent overlapping 
       { 
        Temp.x=rectangle.position.x ; 
        Temp.y=rectangle.position.y; 

       } 

      } 
1

Если в любой момент будет перемещен только один прямоугольник (перетаскивается пользователем), нет необходимости использовать вложенные циклы для проверки n-квадратного совпадения.

Все, что вам нужно, это способ, как это в вашем классе ERMRectangle:

Эти коды предположим, что ваш класс ERMRectangle расширяет Rectangle класс от Java

public boolean isColliding(ArrayList<ERMRectangle> rects) 
{ 
    for(ERMRectangle r : rects) 
     if(this != r && this.intersects(r)) 
      return true; 
    return false; 
} 

Вы можете вызывать isColliding() в mouseReleased(MouseEvent e) в прослушиватель мыши для ваших прямоугольников и запускайте необходимые действия при обнаружении столкновения. Таким образом, после каждого перехода мыши после перетаскивания он проверяет наличие конфликтов на прямоугольнике, который вы только что переместили.

Для проверки на столкновение при перетаскивании поместите аналогичные коды, как в mouseReleased(MouseEvent e), в mouseDragged(MouseEvent e). Это приведет к проверке обнаружения столкновения в реальном времени при перетаскивании прямоугольника.

+0

У меня было это раньше, но моя проблема заключалась в том, что событие mouseDragged не вызывает на каждом пикселе и что Rectangle может застрять на другом, потому что он пропускает вызов по краю –

+0

@DamianGalli Да, он не будет проверять каждый пиксель. Между каждой проверкой есть задержка. В этом случае вы можете проверить выпуск мыши. Или вы все еще хотите проверить в реальном времени? – user3437460

+0

Да, я попытался запустить проверку в реальном времени –

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