java 2D冲突检测的问题

java 2D冲突检测的问题,java,2d,collision,detection,Java,2d,Collision,Detection,我正在用Java编写一个程序来模拟两个物体之间的引力。我已经用两个球(一个固定,一个自由移动)简化了它,并且已经知道了如何对方程进行编程。我希望球在相互碰撞时重置,以防止混淆,但是在编程碰撞检测方法时,它似乎没有按照我希望的方式工作。例如,可以正确检测直接碰撞,但当自由球弯曲到固定球中时,它会直接穿过 我已在Ball类中创建了checkIfCollision方法: public boolean checkIfCollided(Ball ball2) { double xC

我正在用Java编写一个程序来模拟两个物体之间的引力。我已经用两个球(一个固定,一个自由移动)简化了它,并且已经知道了如何对方程进行编程。我希望球在相互碰撞时重置,以防止混淆,但是在编程碰撞检测方法时,它似乎没有按照我希望的方式工作。例如,可以正确检测直接碰撞,但当自由球弯曲到固定球中时,它会直接穿过

我已在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;           
    }

有人能看出我哪里出了错吗?我一直在反复检查球的中心位置,但它似乎仍然没有按照我希望的方式工作。

我认为你的方程是错误的。您正在将中心之间的平方距离与半径的平方和进行比较。你需要将它与半径之和的平方进行比较:(r1+r2)2,而不是r12+r22


另外,我不知道什么是
getxCoord
getyCoord
返回,但是用(xCenter-r,yCenter-r)来表示球体来定义位置似乎是一种奇怪的方式(这似乎是您正在做的,因为您正在添加半径以到达中心).

getxCoord和getyCoord返回什么?getxCoord和getyCoord返回圆的左上角(因此该坐标+半径将是x和y的圆心)。我试着用平方和替换平方和,但没有用。@Erceron-你是说圆的边界框的左上角吗?这是有道理的。当您替换表达式时,行为是否发生了变化?也许你可以发布你当前的代码作为问题的更新,这样我们就可以看到你现在在尝试什么。是的。我只是改变了xCoord和yCoord,以表示圆的中心,而不是左上角,并且它按照预期工作。谢谢你的帮助!:)
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();      
    }
}