“交叉”方法有多准确?

时间:2014-12-13 01:56:55

标签: java geometry collision detection

我试图在昆虫(蟑螂)社会中实施一种碰撞检测算法(限制循环法),只有一个障碍(暂时),为此,障碍物(红色)被一个障碍环绕影响圈(绿色),这里我将计算每个蟑螂的坐标,一旦在“蟑螂”之间检测到交叉点。和影响圈#39;并且一旦有一个交叉点,蟑螂就会停止 它的动作,在我的代码中,有些蟑螂似乎在有任何交叉点之前就停止了移动!我无法理解为什么......我提供了主要代码和交叉方法,我无法看到问题的来源。我希望有人能发现我无法做到的事情。

[应用程序拍摄:] 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){}
    }
}

这是doIntersects方法的代码:

    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!
}

谢谢大家!

编辑: 这是来自Roach类的getBounds方法的代码:

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

2 个答案:

答案 0 :(得分: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.));                  

    }

问题解决了。 =)

答案 1 :(得分:0)

您提供的代码没有任何问题。尽管如此,我找到了你问题的答案:

  

我看不出问题出在哪里。我希望有人能发现我不能发现的事情......

障碍物的绘制位置与变量cercleInfluence中存储的位置不同。确切的顶部和左侧位置差异是红色障碍物和绿色影响圈之间的半径差异。

因此,我假设您通过减去绿色圆圈和红色障碍物之间的宽度/高度(直径)的差异来导出cercleOfInfluence的顶部/左侧。如果只减去一半(半径),则问题将得到解决。您必须减去一次半径差异才能正确绘制绿色圆圈,所以我猜你以后会错误地再次减去它。