2014-12-13 2 views
0

Я пытаюсь реализовать алгоритм обнаружения столкновений (метод предельного цикла) в обществе насекомых (тараканов) с одним препятствием (на данный момент), для чего препятствие (красным) окружено кругом влияния (зеленым), здесь я буду вычислять координаты каждой плотвы, как только пересечение будет обнаружено между «плотвой» и «кругом влияния», и сразу же после того, как будет пересечение, плотва останавливается это движение, в моем коде, некоторые тараканы, похоже, перестают двигаться, даже если есть пересечение! И я не понимаю, почему .. Я предоставил основной код и метод пересечения, я не вижу, откуда эта проблема. Я надеюсь, что кто-то может определить, чего я не смог.Насколько точным является метод «пересечения»?

[ App Shot:] https://www.dropbox.com/s/z0rtf8vxe37617u/Colliding%20Roaches.png?dl=0

Так вот основной код:

public void run() {  
    Roach r = null; //Roach is a class 
    while(true){ 
     for (int i = 0; i < roachs.size(); i++){ 
      r = (Roach) roachs.get(i);     
      if (r.toMove) 
       r.move();  
     //---------------------- COLLISION AVOIDANCE ---------------------------------------- 
      if(doesIntersects(r, cercleInfluence)){ 
       //System.out.println("Intersection detected.");               
       r.toMove = false; 
      }     

     //----------------------------------------------------------------------------------- 

     } 
     repaint(); 
     try{ 
     Thread.sleep(10); 
     } catch(InterruptedException exc){} 
    } 
} 

А вот код метода doesIntersects:

public boolean doesIntersects(Roach r, Ellipse2D.Double sh) { 
    Area circ1, circ2, shape; 
    circ1 = new Area(r.getBounds()); 
    circ2 = new Area(sh); 
    shape=circ1; 

    shape.intersect(circ2); 
    return (!shape.isEmpty());// isEmpty => no intersection! 
} 

Спасибо всем!

EDIT: здесь код метода GetBounds из класса Роуч:

public Ellipse2D.Double getBounds() { 
    return new Ellipse2D.Double(coordinates.x, 
      coordinates.y, 
      10., 
      10. 
      ); 
} 
+0

Привет, Я добавил код метода getBounds, он возвращает Ellipse – Jiru

ответ

0

Там нет ничего плохого с кодом предоставленной Вами. Тем не менее, я нашел ответ на свой вопрос:

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

пролету препятствий рисуется в другом положении, чем хранится в переменной cercleInfluence. Точная верхняя и левая разность позиций - это разница в радиусе между красным препятствием и зеленым кругом влияния.

Поэтому я предполагаю, что вы получили верхнюю/левую часть cercleOfInfluence путем вычитания разницы в ширине/высоте (диаметре) между зеленым кругом и красным препятствием. Если вы вычитаете только половину этого (радиуса), проблема будет исправлена. Вы должны были вычесть разницу радиуса один раз, чтобы правильно нарисовать зеленый круг, поэтому я предполагаю, что вы ошибочно вычитали его позже.

1

Спасибо за ответ, на самом деле спасибо вам, ваше замечание привлекло мое внимание к чему-то еще, к чему проблема, из кода, который рисует тараканов, я вычитал 10. из их координат, что привело к неточности при расчете их точное положение,

Вот что я сделал:

for (int i = 0; i < roachs.size(); i++) { 
     r = (Roach) roachs.get(i); 
     double x_pos; 
     double y_pos; 
     x_pos = r.getCoordinates().x; // - 10.; removed -10 and everything went fine. 
     y_pos = r.getCoordinates().y; // - 10.; 

     g2D.fill(new Ellipse2D.Double(x_pos, 
      y_pos, 
      10., 
      10.));     

    } 

Проблема решена. =)

+0

Отлично! Рад помочь! – gknicker

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