2015-03-13 41 views
0

我正在進行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); 
} 

這大概是所有相關的代碼,請問我,如果你需要看整個程序還是有其他問題的。我真的可以使用你的幫助,該項目即將到期。請記住,我只是高中,而我根本不是一個有經驗的程序員。

回答

2

昨天有一個不同的問題,關於非常類似的代碼:n-body simulation - IndexOutOfBoundsException occurring randomly。您將需要閱讀答案,因爲您的答案似乎容易受到相關問題的影響。

但是,您的特殊問題似乎是您調用resetForces()的位置。由於該方法沒有參數,因此必須重置模擬中所有物體的力。因此,您應該每時間一次調用一次。相反,你每個身體調用一次,所以每次你考慮一個新身體時,你都會消除爲所有其他身體計算的所有力量。

此外,你似乎很奇怪,你正在力量計算混合位置更新。我希望模擬在兩個主,獨立步驟爲每個時間段進行:

  1. 計算作用在每個本體在模擬的間隔開始的淨力,那麼
  2. 更新速度和每個物體的位置,基於它的初始位置和速度以及作用在其上的淨力。

如果你這樣做碰撞檢測(因爲實際上你做的),應該爲每個時間間隔大概進行畢竟位置更新已經完成,不與位置更新交錯,否則在某些情況下,你會比較來自不同時間的職位。

+0

儘管效率低下,但resetForces方法不是問題,因爲設置力時也會設置加速度。因此,即使力在身體上覆位,它也會記住加速度並據此移動。但我已經改變了它,以便它只重置循環中的索引的力量。 雖然代碼不會更長嗎?有沒有理由不這樣做? – Arcthor 2015-03-13 22:29:32

+0

會有其他問題嗎? @John Bollinger – Arcthor 2015-03-14 00:03:36

+0

當然可能會有另一個問題。你沒有提供你所有的代碼,所以我怎麼知道它的內容?不,這不是一個邀請。這不是代碼評論網站。 – 2015-03-16 16:37:45