2015-08-25 36 views
2

因此,我從wikipedia得到了一個方程來發現拋射體可以用不同的給定變量(如角度和速度(高度和重力是可選的,高度將默認爲0))行進的距離。這就是它看起來像在代碼:爲什麼Wiki的彈道軌跡公式給出了奇怪的結果?

dist = ((velocity * velocity)/9.807f) * (float)Math.Sin(angle * 2); 

我也試過這樣:

dist = ((velocity * velocity) * (float)Math.Sin(angle * 2))/9.807f; 

均未給予可喜的成果。第一個給我像91一樣......而另一個給我一個負面的東西。

謝謝。

+8

'angle'是否包含度數或弧度的角度? Math.Sin需要弧度。 – Heinzi

+0

我猜你的角度是無效的,可能你忘了將它轉換成deg <-> rad。另外,即便如此,僅僅移動像這樣的'/ 9.807f'也不可能突然出現負面現象。要麼他們已經出現在第一個案件中,要麼你在其他地方也必須有錯誤。很難說沒有代碼的休息。 – quetzalcoatl

+1

另外,以米/秒爲單位的速度? – theB

回答

1

這些看起來是等價的(應該給出任何變量值相同的答案),如果你使用了正確的單位,它們都應該給你正確的答案。您需要將角度轉換爲度數。正如@theB指出的那樣,速度應該以米/秒爲單位,距離輸出將以米爲單位。

要做的最好的事情是採取最簡單的數字,例如velocity = 1,g = 10和45度角(pi/4弧度)。檢查你是否得到正確的答案。它應該非常簡單,您可以使用計算器自行計算結果。先把它弄好。然後使用其他值作爲輸入,一次更改一個值。

正如@PeterSchneider在評論中所說,檢查我們立即知道答案的值(例如90度和0度)可能非常有用。這些看起來像是現實生活中永遠不需要的毫無意義的例子。然而,它們作爲測試用例具有以下優點:

  • 指定行爲應該是很容易的。
  • 通過檢查這些情況,您可能會發現一個影響其他值的錯誤。
  • 相反,您可能會發現一個錯誤處理邊緣情況的方式,您不會發現這種情況,這種情況除以零。

一些邊緣案例可能非常棘手。萬一重力是零怎麼辦?

你應該把你的代碼放在一個函數中,該函數需要velocitygangle作爲參數並返回距離。這將允許您輕鬆地嘗試多個不同的輸入。

這種程序有一種形式化,稱爲單元測試。你寫了一小段測試代碼,它檢查不同的情況,從最簡單的可能開始。每次進行更改時,都要重新運行測試以確保一切仍然正常。如果你有興趣,你可以看一下名爲NUnit的C#單元測試框架。它作爲VS的加載項並且非常簡單易用。

+1

很好的建議。您可以通過其他方式預先計算或查找測試值的正確預期結果。例如,我們邏輯地知道,90度 - 直線向上和0度(直線向前,立即點擊地面)應該產生0.這些預期結果是硬連線的(或者用已知的工作庫計算)進入測試,並將您的功能的結果與它進行比較。小心浮點數比較:由於涉及到不可避免的舍入誤差,它們通常需要比較間隔。 –

+0

謝謝,問題是它需要弧度...愚蠢noob我。再次感謝您的答覆和所有評論。他們引導我走向正確的方向。 – Firedan1176

相關問題