物理数据类型

时间:2008-08-26 19:20:35

标签: c# types physics

我目前正在设计一个涉及一些物理的程序(没什么太奇特,几个球相互撞击)

在c#中,我可以使用哪种最准确的数据类型来表示位置(没有离散跳跃的感觉)?

另外,在t和t + 1之间我可以得到的最小时间是多少?一滴?

编辑:澄清:C#中最小的时间单位是多少? [TimeSpan].Tick

8 个答案:

答案 0 :(得分:9)

在.Net中,decimal将是您可以用于位置的最精确的数据类型。我只想写一个职位的课程:

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

至于时间,你的处理器不能给你任何小于一个滴答的东西。

听起来像一个有趣的项目!祝你好运!

答案 1 :(得分:9)

十进制数据类型虽然精确可能不是最佳选择,具体取决于您想要做什么。通常,Direct3D和GPU使用32位浮点数,以及3(总共96位)的向量来表示x,y,z中的位置。

除非你需要在同一个“世界”中混合大尺度(行星)和微观水平(篮球),否则这通常会提供足够的精确度。

不使用小数的原因可能是尺寸(大4倍),速度(数量级更慢)和没有三角函数(AFAIK)。

在Windows上,QueryPerformanceCounter API函数会为您提供最高分辨率的时钟,以及QueryPerformanceFrequency计数器的频率。我相信其他评论中描述的秒表将其包含在.net类中。

答案 2 :(得分:5)

除非你正在做火箭科学,否则小数就是WAAAY矫枉过正。虽然它可能会给你更精确的位置,但它不一定会给你更精确的(例如)速度,因为它是一个定点数据类型,因此被限制在比浮点数或双精度小得多的范围内。

使用浮动,但保持门打开以向上移动到双打,以防精确度成为问题。

答案 3 :(得分:3)

我会使用Vector数据类型。就像在物理学中一样,当你想要模拟一个物体运动时,你可以使用矢量。使用Vector2Vector3 class out of the XNA框架或滚动own Vector3 struct来代表该职位。 Vector2用于2D,Vector3用于3D。

TimeSpan struct或Stopwatch类将是您计算时间变化的最佳选择。如果我不得不推荐,我会使用秒表。

答案 4 :(得分:0)

我不确定我理解你的上一个问题,请你澄清一下?

编辑:

我可能仍然不明白,但您可以使用任何您想要的类型(例如,双打)来表示时间(如果您真正想要的是表示物理问题的时间离散化,在这种情况下,刻度是无关)。对于大多数物理问题,双打就足够了。

勾选是用机器测量时间时可以达到的最佳精度。

答案 5 :(得分:0)

我认为你应该能够毫无问题地摆脱Decimal数据类型。它具有最高的精度。但是,双数据类型应该没问题。

是的,勾选是我所知道的最小(使用System.Diagnostics.Stopwatch类)。

答案 6 :(得分:0)

对于模拟,你可能最好使用十进制/双精度(与位置相同的类型)进行无量纲时间,然后将其从/转换为有意义的输入/输出。否则,当你搬东西时,你将会进行大量的施法操作。你也可以通过这种方式获得任意精度,因为你可以根据需要选择时间尺度。

答案 7 :(得分:0)

嘿Juan,我建议您使用其他几个人建议的Vector3类,因为它易于使用,最重要的是 - 支持您需要的所有操作(如加法,乘法,矩阵乘法等等),而不是需要自己实现它。 如果您对如何继续有任何疑问 - 继承它并在以后阶段您可以随时更改内部实现,或断开与vector3的连接。

此外,不要使用比浮动更精确的东西 - 这些天所有的处理器运行得足够快,比整数更准确(除非它适用于移动设备,但即使在那里......) 使用小于浮点数会很快失去精度,最终会出现跳跃旋转和平移,特别是如果您计划使用多个矩阵/四元数乘法。