2014-12-13 23 views
0

我试图在一个有一个障碍物(现在)的昆虫社区(蟑螂)中实现碰撞检测算法(极限环法),因为这个障碍物(红色)被一圈影响包围(绿色),在这里我将计算每个蟑螂的坐标,一旦在'蟑螂'和'影响圈'之间检测到交集,并且立即一旦有交集,蟑螂就停止运动,在我的代码中,一些即使有任何交点,蟑螂似乎也停止移动!我不明白为什么..我已经提供了主要代码和交集方法,我看不出从哪里来的问题..我希望有人可以发现我不能..“相交”方法有多准确?

[应用射击:] 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! 
} 

谢谢大家!

编辑: 这里是从类罗奇getBounds方法的代码:

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

嗨,我已经添加了getBounds方法的代码,它返回一个椭圆 – Jiru 2014-12-13 12:42:30

回答

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 2014-12-13 20:36:05