2008-08-26 65 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更小的范围内。

使用漂浮物,但如果精度变成问题,请将门打开以提高到双打。