我对 Java 很陌生,我正在使用 ACM 库来处理图形。我试图用这段代码做的是:
- 引入两个球,一个在左侧,一个在中间。他们都在中间,y坐标。
- 使第一个球移动,直到遇到第二个球。然后停下来,给第二个球一个与其大小成正比的速度(类似于动量守恒)。
- 使第二个球反弹墙壁,并移动直到遇到第一个球。然后停下来,再次给第一个球一个与其大小成正比的速度。
- 让这个动作无限。
我的代码是这样的:
import java.awt.Color;
import acm.graphics.*;
import acm.program.*;
import acm.util.RandomGenerator;
public class Collision extends GraphicsProgram {
private static final double RADIUS_ONE = 35;
private static final double RADIUS_TWO = 65;
public void run() {
GOval ballOne = new GOval(0, (getHeight() - RADIUS_ONE)/2, RADIUS_ONE, RADIUS_ONE);
ballOne.setFilled(true);
ballOne.setColor(Color.GREEN);
add(ballOne);
GOval ballTwo = new GOval((getWidth() - RADIUS_TWO)/2, (getHeight() - RADIUS_TWO)/2, RADIUS_TWO, RADIUS_TWO);
ballTwo.setFilled(true);
ballTwo.setColor(Color.ORANGE);
add(ballTwo);
double velocityOne = 3;
double velocityTwo = 0;
while (true) {
ballOne.move(velocityOne, 0);
ballTwo.move(velocityTwo, 0);
if (ballOne.getX() >= getWidth() - RADIUS_ONE || ballOne.getX() <= 0) {
velocityOne = -velocityOne;
}
if (ballTwo.getX() >= getWidth() - RADIUS_TWO || ballTwo.getX() <= 0) {
velocityTwo = -velocityTwo;
}
if (ballOne.getX() + RADIUS_ONE >= ballTwo.getX()) {
if (velocityTwo == 0) {
velocityTwo = (velocityOne * RADIUS_ONE * RADIUS_ONE)/(RADIUS_TWO * RADIUS_TWO);
velocityOne = 0;
} else if (velocityOne == 0) {
velocityOne = (velocityTwo * RADIUS_TWO * RADIUS_TWO)/(RADIUS_ONE * RADIUS_ONE);
velocityTwo = 0;
}
}
pause(10);
}
}
}
如果您运行此代码,您会看到它出现故障。在遇到第二个球时,第一个球不会停止移动,而是与第二个球一起移动。但是,如果您更改velocityOne
为 2 而不是 3,则一切正常。或者,如果您RADIUS_TWO
使用 45 而不是 65,则代码对每个velocityOne
.
有人能解释一下为什么这段代码在大多数值上都出现故障,而它的工作却很少吗?非常感谢。