我正在使用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();
}
}
谁能看到我出错的地方?我一直在检查球的中心是一遍又一遍,但它似乎仍然没有按照我想要的方式工作。
答案 0 :(得分:2)
我认为你的方程是错误的。您正在比较中心之间的平方距离与半径的平方和。你需要将它与半径之和的平方比较:(r 1 + r 2 ) 2 而不是r 1 子> 2 + R <子> 2 子> 2
另外,我不知道getxCoord
和getyCoord
返回了什么,但是通过(xCenter - r,yCenter - r)来表示定义位置的球体似乎是一种奇怪的方法(其中看来你正在做,因为你要加入半径来到达中心。)