java 2D碰撞检测有问题

时间:2014-07-11 17:52:15

标签: java 2d collision detection

我正在使用Java制作一个程序来模拟两个物体之间的引力。我通过使用2个球(一个固定,一个可自由移动)简化了它,并且已经弄清楚如何编程方程式。我想让球在彼此碰撞时重置,以防止混淆,但在编程碰撞检测方法时,它似乎不像我想要的那样工作。例如,可以正确检测到直接碰撞,但是当自由球弯曲成固定球时,它会直接进行剪切。

我在Ball类中创建了一个checkIfCollision方法:

public boolean checkIfCollided(Ball ball2)
    {
        double xCenter1 = getxCoord()+getRadius();
        double yCenter1 = getyCoord()+getRadius();  

        double xCenter2 = ball2.getxCoord()+ball2.getRadius();
        double yCenter2 = ball2.getyCoord()+ball2.getRadius();

        double xDiff = (xCenter2-xCenter1);
        double yDiff = (yCenter2-yCenter1);

        double sqrRadius = (getRadius()*getRadius())+(ball2.getRadius()*ball2.getRadius());

        double sqrDistance = (((xDiff*xDiff) + (yDiff*yDiff)));


        if (sqrDistance <= (sqrRadius))
        {
            return true;
        }           
        return false;           
    }

我的主程序中有一个定时器循环,这是我调用方法的地方

public void actionPerformed(ActionEvent e) 
{
    if (e.getActionCommand() == "myTimer")
    {
        if (player.checkIfCollided(planet))
        {
            reset();
        }
        Vector2D radius = new Vector2D((float)(planet.getxCoord()-player.getxCoord()), (float) (planet.getyCoord()-player.getyCoord()));
        if (ballIsReleased)
        {   
            float forceFactor = (float) ((G * player.getMass() * planet.getMass())/(radius.magnitude()*radius.magnitude()))*300;
            player.setAccelleration(new Vector2D((float)(planet.getxCoord()-player.getxCoord())/500, (float)(planet.getyCoord()-player.getyCoord())/500), forceFactor);
            player.move();  
        }
        if (player.checkIfCollided(planet))
        {
            reset();
        }
        repaint();      
    }
}

谁能看到我出错的地方?我一直在检查球的中心是一遍又一遍,但它似乎仍然没有按照我想要的方式工作。

1 个答案:

答案 0 :(得分:2)

我认为你的方程是错误的。您正在比较中心之间的平方距离与半径的平方和。你需要将它与半径之和的平方比较:(r 1 + r 2 2 而不是r 1 2 + R <子> 2 2

另外,我不知道getxCoordgetyCoord返回了什么,但是通过(xCenter - r,yCenter - r)来表示定义位置的球体似乎是一种奇怪的方法(其中看来你正在做,因为你要加入半径来到达中心。)