Реализовать обнаружение столкновений, расширив класс Rectangle, чтобы использовать методы содержащий и пересекающий - PullRequest
3 голосов
/ 19 марта 2010

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

  1. Создайте свой собственный класс обнаружения столкновений, который расширяет класс Rectangle.
  2. Тогда, когда экземпляр этого объекта делает что-то вроде Collision col = new Rectangle(); <- Должен ли я это делать или этого следует избегать? Я знаю, что я <strong>могу ', но должен я?
  3. Я хочу расширить класс Rectangle из-за методов contains() и intersects(); я должен делать это, или я должен делать что-то еще для обнаружения 2D столкновений в Java?

Ответы [ 3 ]

7 голосов
/ 19 марта 2010

Между Столкновением и Прямоугольником нет отношения is-a, столкновение не является прямоугольником. Домен коллизий может иметь прямоугольники, что говорит о том, что вы используете состав .

2 голосов
/ 19 марта 2010

Вы можете легко продлить Rectangle

class CollidableRectangle extends Rectangle
{
  public boolean isCollidingWith(Rectangle otherRect)
  {
    //check collision
  }

  // return all collisions
  public List<CollidableRectangle> getCollisions(List<Rectangle)
  {
    // code
  }
}

тогда вы бы использовали его как:

CollidableRectangle r1 = new CollidableRectangle();
CollidableRectangle r2 = new CollidableRectangle();

r1.isCollidingWith(r2);

//and so on

Как отмечается в комментариях, я не использовал Collision класс. Обычно вам это нужно, потому что вас также интересуют параметры столкновения, такие как глубина или сталкивающаяся плоскость , поэтому у вас будет что-то вроде:

class Collision
{
   CollidableRectangle first, second;
   float depth;
   Line2D collidingLine;
}

и метод вернет список столкновений:

public List<Collision> getCollisions(List<Rectangle) { ... }
0 голосов
/ 19 марта 2010

А как насчет того, чтобы сделать его не связанным с Rectangle? Создайте новый автономный модуль Collision и работайте с любыми другими типами.

(я не знаю Java, извините за любые проблемы здесь)

class Collision
{
   public boolean BetweenRectangles(Rectangle a, Rectangle b)
   {
   }

   public boolean BetweenCircles(Circle a, Circle b)
   {
   }

   public boolean RectangleToCircle(Rectangle r, Circle c)
   {
   }

   public boolean MyCrazyShapeToRectangle(MyCrazyShape mcs, Rectangle r)
   {
   }
}

ИМХО, на самом деле не имеет смысла делать столкновение из прямоугольника, потому что столкновение является ортогональным понятием для прямоугольника, и склеивание их вместе без необходимости ограничивает ваши будущие варианты. Главное, что нужно понять, это то, что вам не нужен объект столкновения, по сути, эти функции носят процедурный характер (есть ли в Java что-то вроде «статического» модификатора C ++ для функций-членов области класса?). Само столкновение не является собственностью ни одного из участников столкновения.

...