Java 在粒子模拟中使用蛙跳积分可以实现什么?
我一直在用Java进行粒子模拟,我对蛙跳集成有点困惑 我读到它“保存能量”,并认为这意味着我的粒子将不再以荒谬的速度抛射,当它们的分离距离接近零时。然而,它仍然发生。我是否误解了跨越式集成的意义,或者我是否实施了错误的集成 发生的情况如下: 我看不到单独基于当前位置的力更新速度与平均速度之间的结果有任何差异 除非我需要,否则我不会发布我的整个项目,因为它相当长。模拟是使用Java swing计时器运行的,该计时器只在每个实体上运行updatePosition,然后运行updateVelocity,然后将它们全部绘制出来 以下是body类:Java 在粒子模拟中使用蛙跳积分可以实现什么?,java,physics,particle-system,Java,Physics,Particle System,我一直在用Java进行粒子模拟,我对蛙跳集成有点困惑 我读到它“保存能量”,并认为这意味着我的粒子将不再以荒谬的速度抛射,当它们的分离距离接近零时。然而,它仍然发生。我是否误解了跨越式集成的意义,或者我是否实施了错误的集成 发生的情况如下: 我看不到单独基于当前位置的力更新速度与平均速度之间的结果有任何差异 除非我需要,否则我不会发布我的整个项目,因为它相当长。模拟是使用Java swing计时器运行的,该计时器只在每个实体上运行updatePosition,然后运行updateVelocity
public class Body {
private final double G = 100; // Gravity strength
private double xPos, yPos;
private double xVel, yVel;
private double radius;
private double mass;
private double oldFx;
private double oldFy;
public Body(double xPos, double yPos, double xVel, double yVel, double radius) {
this.xPos = xPos;
this.yPos = yPos;
this.xVel = xVel;
this.yVel = yVel;
this.radius = radius;
this.mass = Math.PI * radius * radius;
this.oldFx = 0;
this.oldFy = 0;
}
void updatePosition() {
xPos += xVel;
yPos += yVel;
}
void updateVelocity(Body b) {
double DT = BHMain.DT/1000.0; // Time step
// Force on this body
double dx = xPos - b.xPos;
double dy = yPos - b.yPos;
double r = Math.sqrt((dx*dx + dy*dy));
double newF = - G * mass * b.mass / (r*r);
double angle = Math.atan2(dy, dx);
double newFx = newF*Math.cos(angle);
double newFy = newF*Math.sin(angle);
double Fx = (oldFx + newFx) / 2;
double Fy = (oldFy + newFy) / 2;
// Update velocity. a = F / m. v = v0 + a*t
xVel += DT * Fx / mass;
yVel += DT * Fy / mass;
oldFx = newFx;
oldFy = newFy;
}
void drawBody(Graphics g) {
int diameter = (int) (2 * radius);
int x = (int) (xPos - radius);
int y = (int) (yPos - radius);
g.fillOval(x, y, diameter, diameter);
}
}
尝试将位置更新与时间步长相乘<代码>xPos+=xVel*DT。尝试减少时间步长,在帧之间执行4个1/4大小的步骤,而不是一个完整的步骤。哦,是的,我在更新XPO时忘记了DT。我修复了这个问题,但它只会减慢动画的速度。我仍然有粒子在接触时不稳定地飞走。4步是什么意思?这难道不等于用一半的时间步走两步,我仍然在力量和位置之间跳跃,对吗?减少时间步长只会减慢动画的速度