2013-10-29 24 views
0

我有一個高度爲600像素的視圖,每個像素爲50個像素,每個像素爲12個框。我創建了一個球,用戶在重力的作用下點擊。我正在做這個物理演示,我試圖讓它儘可能準確。目前,我正在使用的規模使用四個盒子(或200像素)作爲一米。計算「y」位置的方法被稱爲每秒50次(50 fps)。當我嘗試使用此代碼運行該程序時,它的運行時間相當長。爲Java創建精確的引力

這是我打電話到更新位置的方法:我通過200乘以米轉換爲像素

public double calcY() 
{ 
    velocity += acceleration*200/2500; 
    return(getY()-velocity); 
} 

。 除以2500,因爲它被稱爲每秒50次,所以(50)^ 2是2500.

現在它不是很多。 感謝您的幫助。

+0

你採取更新率平方的原因是什麼?我懷疑這是必要的。 – Philipp

+2

'v = v0 + a * t'(沒有t^2)。看到'getY() - velocity'也是很奇怪的......通常會採用相同的'y = y0 + v * t'(當組合這兩個方程時會出現t^2)。此外,通常會使用* actual *經過時間,而不是預期的經過時間。 – user2864740

+0

另外,你確定你的更新函數每秒被調用50次嗎?您的計時代碼中可能存在錯誤?一個典型的初學者錯誤是忘記考慮執行更新函數本身所花費的時間。 – Philipp

回答

2

您的計算不應該綁定到固定幀速率,測量已過期的實時。 FPS可以並且會因您控制以外的因素而發生很大變化。

您可以使用System.currentTimeMillis()調用calcY()之間的時間到期,這可能在兩次調用之間差幾毫秒,但它在多次調用中會非常精確。

同樣我上次檢查的秋季加速度不是每秒一米,而是9.81米/秒。所以你的計算加速度似乎是9.81的因素。

編輯:再看看你的公式,這對我來說沒有任何意義。

+0

測量時間到期可讓您計算兩幀之間的時間的正確動作(您知道兩者之間的時間已過)。這可以讓你計算出當時的正確答案。固定*速率在以不同速率調用的方法中沒有位置,例如屏幕更新總是如此。 – Durandal

+0

地球上的重力導致加速度爲9.8m/s^2。在其他地方,如火星或模擬器中,加速度可能會更慢或更快。 –

+0

當然,但我最近並沒有去過火星。任何時候有人說*重力*而沒有說明我偏向於假設地球*的地方。也許我是大地沙文主義:) – Durandal

0

您應該從運動方程開始。

x = x0 + v0*t + 1/2*a*t^2 

加速時間時間平方有單位的位置。這裏的t是絕對時間。如果你想逐幀計算位置。

v = v0 + a*dt 
x = x0 + v0*dt + 1/2*a*dt^2 

這裏,每個時間在你計算最終位置和速度,並用其作爲初始位置和下一幀的速度。

+0

我將我的代碼更改爲以下內容:'return(getY() - (0.5 * acceleration * 200 * Math.pow((System。currentTimeMillios() - 米利斯)/ 1000,2)));」我從等式x = x0 + v0 * dt + 1/2 * a * dt^2中得到了這個結果,其中初始速度爲0,x0爲getY()。我以毫秒爲單位將差值除以1000得到秒。在這種情況下的加速度是「9.8」,我乘以200將其轉換爲像素。變量「millis」是它開始下降的時間。然而,當我跑出這個球時,球的速度幾乎是它應有的速度的兩倍。有什麼想法嗎? – user2929299

+0

每次調用getY()時都要更新它嗎?由於x = x0 + v0 * dt + 1/2 * a * dt^2計算絕對位置,所以初始位置應在整個時間內保持不變。確保每次調用calcY()期間getY()返回的值都不會更改。 – user1139069