Java N-body仿真-某些情况下不计算车身的力

Java N-body仿真-某些情况下不计算车身的力,java,Java,我正在做一个n体模拟。出于某种原因,当我有两个物体彼此绕轨道运行,我加上第三个物体,两个初始物体停止绕轨道运行 例如: -地球绕太阳运行,当我加上火星时,地球和火星不绕太阳运行,它们都沿直线运行。几乎和物体上的力完全没有计算一样。这怎么可能 以下是相关代码: 更新 public void update(float deltaTime){ for(int i=0; i<bodies.size();i++){ re

我正在做一个n体模拟。出于某种原因,当我有两个物体彼此绕轨道运行,我加上第三个物体,两个初始物体停止绕轨道运行

例如:

-地球绕太阳运行,当我加上火星时,地球和火星不绕太阳运行,它们都沿直线运行。几乎和物体上的力完全没有计算一样。这怎么可能

以下是相关代码:

更新

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);
    }