2008-08-26 68 views
9

我目前正在設計一個程序,將涉及到一些物理(沒有什麼太花哨,幾個球轟然對方)數據類型爲物理

什麼是最準確的數據類型,我可以用它來代表位置(無感覺離散跳轉)在C#?

另外,我可以在t和t + 1之間獲得的最小時間量是多少?一個勾號?

編輯:澄清:什麼是在C#中的最小時間單位? [TimeSpan].Tick

回答

8

在.net a decimal將是您可以用於位置的最精確的數據類型。我只寫一個類的位置:

public class Position 
{ 
    decimal x; 
    decimal y; 
    decimal z; 
} 

至於時間,您的處理器不能給你任何東西比一個刻度較小。

聽起來像一個有趣的項目!祝你好運!

+1

-1:小數在任何3D遊戲計算中都很少使用,它們太慢了。使用一個由3個浮點構建的Vector類,你就全部設置好了。 – 2009-02-24 18:29:19

+1

+1:對於實際類型,十進制是最精確的,這就是問題所在。 – Rusty 2010-05-20 21:24:20

0

我不確定我是否理解你最後的問題,請你澄清一下嗎?

編輯:

我仍然可能不明白,但你可以使用你想要的(例如,雙打)的任何類型來表示時間(如果你真正想要的是代表時間的離散爲你的物理問題在這種情況下,勾號是不相關的)。對於大多數物理問題,雙打就足夠了。

刻度是您在使用機器測量時間時可以達到的最佳精度。

0

我認爲你應該能夠擺脫十進制數據類型沒有問題。它具有最高的精度。但是,雙數據類型應該很好。

是的,打勾是我知道的最小(使用System.Diagnostics.Stopwatch類)。

0

對於一個模擬,你可能最好在無量綱時間內使用小數/雙精度(與位置相同的類型),然後將其轉換爲輸入/輸出中有意義的值。否則,當你移動東西時,你會執行大量的演員操作。這樣你也可以得到任意的精度,因爲你可以選擇時間尺度作爲你想要的大小。

9

十進制數據類型雖然精確可能不是最佳選擇,具體取決於您想要做什麼。通常Direct3D和GPU使用32位浮點數,向量3(總共96位)表示x,y,z中的位置。

這通常會帶來足夠的精度,除非您需要在同一個「世界」中混合巨大尺度(行星)和微觀水平(籃球)。

不使用小數的原因可能是大小(4倍大),速度(數量級較慢)以及沒有可用的三角函數(AFAIK)。

在Windows上,QueryPerformanceCounter API函數會爲您提供最高分辨率的時鐘和QueryPerformanceFrequency計數器的頻率。我相信其他評論中描述的秒錶包裝在.net類中。

3

我會使用矢量數據類型。就像在物理學中一樣,當你想要對物體運動進行建模時,就可以使用矢量。使用Vector2Vector3 class out of the XNA框架或滾動您的own Vector3 struct來表示位置。 Vector2是2D,Vector3是3D。

TimeSpan struct或Stopwatch類將是您計算時間變化的最佳選擇。如果我不得不推薦,我會使用秒錶。

0

嘿胡安,我建議你使用Vector3類,如其他幾個人所建議的,因爲它很容易使用,並且最重要的是 - 支持所有你需要的操作(如加法,乘法,矩陣乘法等)需要自己實現它。 如果您對如何繼續進行任何懷疑 - 繼承它,並且在以後階段,您可以隨時更改內部實現或斷開與vector3的連接。

另外,不要使用比float更不準確的東西 - 所有處理器的運行速度足以比整數更精確(除非它是用於移動設備,但即使在那裏...) 使用少於float的非常快速地失去精度,並最終導致跳躍旋轉和翻譯,特別是如果您打算使用多於一個矩陣/四元數乘法。

5

除非你在做火箭科學,否則小數點是WAAAY矯枉過正。儘管它可能會給你更精確的位置,但它不一定會給你更精確的(例如)速度,因爲它是一個定點數據類型,因此被限制在一個比float或double更小的範圍內。

使用漂浮物,但如果精度變成問題,請將門打開以提高到雙打。