Java N-body仿真-某些情况下不计算车身的力
我正在做一个n体模拟。出于某种原因,当我有两个物体彼此绕轨道运行,我加上第三个物体,两个初始物体停止绕轨道运行 例如: -地球绕太阳运行,当我加上火星时,地球和火星不绕太阳运行,它们都沿直线运行。几乎和物体上的力完全没有计算一样。这怎么可能 以下是相关代码: 更新Java N-body仿真-某些情况下不计算车身的力,java,Java,我正在做一个n体模拟。出于某种原因,当我有两个物体彼此绕轨道运行,我加上第三个物体,两个初始物体停止绕轨道运行 例如: -地球绕太阳运行,当我加上火星时,地球和火星不绕太阳运行,它们都沿直线运行。几乎和物体上的力完全没有计算一样。这怎么可能 以下是相关代码: 更新 public void update(float deltaTime){ for(int i=0; i<bodies.size();i++){ re
public void update(float deltaTime){
for(int i=0; i<bodies.size();i++){
resetForces();
bodies.get(i).update((float)(deltaTime / Math.pow(10,9))*timeScale);
lastTime = System.nanoTime();
//sets the forces for all bodies
for(int n=0; n<bodies.size();n++){
if(bodies.get(i)!=bodies.get(n)){
if(bodies.get(i) == null || bodies.get(n)==null){
System.out.println("nullPointerException error averted");
}else{
bodies.get(i).setForce(Physics.getFx(bodies.get(i), bodies.get(n)), Physics.getFy(bodies.get(i), bodies.get(n)));
}
if(Physics.getDistanceBetween(bodies.get(i), bodies.get(n)) < (bodies.get(i).radius + bodies.get(n).radius)*distanceScale){
collision(bodies.get(i),bodies.get(n));
if(bodies.size()==i){
return;
}
}
}
}
}
}
这可能是所有相关的代码,如果您需要查看整个程序或有任何其他问题,请询问我。我真的需要你的帮助,这个项目很快就要到期了。请记住,我只是一名高中生,我根本不是一名经验丰富的程序员。昨天有一个关于非常相似的代码的不同问题:。你会想要阅读答案,因为你的答案看起来很容易受到同样问题的影响 但是,您的特殊问题似乎是调用
resetForces()
的位置。由于该方法不带参数,因此必须重置模拟中所有实体的力。因此,您应该在每个时间步调用它一次。相反,你每次调用它一次,所以每次你考虑一个新的物体,你也会删除所有其他物体所计算的所有力。
此外,将位置更新与力计算混合在一起似乎很奇怪。我预计模拟将在每个时间间隔内分为两个主要的独立步骤进行:
如果您执行碰撞检测(确实如此),则可能应该在执行所有位置更新后的每个时间间隔执行碰撞检测,而不是与位置更新交错,否则在某些情况下,您将比较不同时间的位置。虽然效率不高,重置力方法不是问题,因为设置力时也会设置加速度。因此,即使物体上的力被重置,它也会记住加速度并根据加速度移动。但是我改变了它,这样它只会重置循环中索引的力。但是代码不是要长很多吗?有什么理由不做我已经做过的事吗?还有其他问题吗@约翰·博林格确信可能还有另一个问题。你还没有展示你所有的代码,我怎么知道里面有什么?不,那不是邀请。这不是一个代码审查站点。
public void sun(){
sun = new Body("Sun", Physics.massSun, 20, 0,0, new Color(0xffff00), (float)0, (float)0);
bodies.add(sun);
}
public void earth(){
earth = new Body("earth", Physics.massEarth, 10, Physics.astUnit/distanceScale,0, new Color(0x0000ff), (float)0, (float)0);
bodies.add(earth);
earth.setVelocity(0,(float)Physics.getInitVy((long)Physics.getDistanceBetween(earth, sun), sun));
}
public void mars(){
mars = new Body("Mars", Physics.massMars, 10, (long)(1.5*Physics.astUnit/distanceScale) ,0, new Color(0x00ff00), (float)0, (float)0);
mars.setVelocity(0,(float)Physics.getInitVy((long)Physics.getDistanceBetween(mars, sun), sun));
bodies.add(mars);
}