我正在進行N體仿真。出於某種原因,當我有兩個相互圍繞的物體,並且我增加了第三個物體時,兩個最初的物體停止相互圍繞着軌道。N體仿真 - 在某些情況下不計算身體的力
例:
http://i.imgur.com/6zlKPMv.png - 地球繞太陽公轉,當我添加火星,http://i.imgur.com/gybHGZE.png,地球和火星不繞太陽運行,並在一條直線上兩個行駛。幾乎所有的力量都沒有在身體上計算。怎麼會這樣?
下面是相關代碼:
UPDATE
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;
}
}
}
}
}
}
行星
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);
}
這大概是所有相關的代碼,請問我,如果你需要看整個程序還是有其他問題的。我真的可以使用你的幫助,該項目即將到期。請記住,我只是高中,而我根本不是一個有經驗的程序員。
儘管效率低下,但resetForces方法不是問題,因爲設置力時也會設置加速度。因此,即使力在身體上覆位,它也會記住加速度並據此移動。但我已經改變了它,以便它只重置循環中的索引的力量。 雖然代碼不會更長嗎?有沒有理由不這樣做? – Arcthor 2015-03-13 22:29:32
會有其他問題嗎? @John Bollinger – Arcthor 2015-03-14 00:03:36
當然可能會有另一個問題。你沒有提供你所有的代碼,所以我怎麼知道它的內容?不,這不是一個邀請。這不是代碼評論網站。 – 2015-03-16 16:37:45