物理数据类型

时间:2020-03-05 18:43:30  来源:igfitidea点击:

我目前正在设计一个程序,该程序将涉及一些物理问题(没什么花哨的东西,几个球相互撞击)

我可以用来代表C#中的位置(没有离散跳跃感)的最准确的数据类型是什么?

另外,我在t和t + 1之间可以获得的最短时间是多少?一tick?

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

解决方案

回答

我不确定我是否理解最后一个问题,能否请我们澄清一下?

编辑:

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

节拍是使用机器测量时间时可以达到的最佳精度。

回答

在.Net中,"十进制"将是我们可以用于定位的最精确的数据类型。我只想为这个职位写一个班级:

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

至于时间,处理器不能给我们任何小于一滴答的声音。

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

回答

我认为我们应该可以毫无疑问地摆脱Decimal数据类型。它具有最精确的精度。但是,双精度数据类型应该就可以了。

是的,我知道的最小滴答(使用System.Diagnostics.Stopwatch类)。

回答

对于模拟,最好使用十进制/双精度(与位置相同的类型)无量纲的时间,然后将其从输入/输出转换为有意义的值。否则,当我们四处移动东西时,我们将执行大量的投射操作。我们也可以通过这种方式获得任意精度,因为我们可以选择所需的时间范围,以使其与时俱进。

回答

尽管精确,但十进制数据类型可能不是最佳选择,具体取决于我们要执行的操作。通常,Direct3D和GPU使用32位浮点数,并且3(总共96位)的向量表示x,y,z中的位置。

除非我们需要在同一个"世界"中同时混合巨大的尺度(行星)和微观的尺度(篮球),否则这通常会提供足够的精度。

不使用小数的原因可能是大小(大4倍),速度(慢几个数量级)并且没有可用的三角函数(AFAIK)。

在Windows上,QueryPerformanceCounter API函数将为我们提供最高分辨率的时钟,而QueryPerformanceFrequency则为计数器的频率。我相信其他注释中描述的秒表会将其包装在.net类中。

回答

我将使用Vector数据类型。就像在物理学中一样,当我们要为对象运动建模时,可以使用矢量。使用XNA框架之外的Vector2或者Vector3类,或者滚动自己的Vector3结构来表示位置。 Vector2适用于2D,Vector3适用于3D。

TimeSpan结构或者Stopwatch类将是计算时间变化的最佳选择。如果必须推荐,我将使用秒表。

回答

嗨,胡安,我建议我们按照其他一些人的建议使用Vector3类,因为它易于使用,并且最重要的是它支持我们需要执行的所有操作(例如加法,乘法,矩阵乘法等),而无需实现它你自己。
如果我们对如何继续继承有任何疑问,在以后的阶段,我们可以随时更改内部实现,或者与vector3断开连接。

另外,不要使用比浮点数更精确的东西,这些天所有处理器的运行速度都快于整数(除非它是用于移动设备的,但即使在移动设备中也是如此……)
如果使用少于float的值,则会很快失去精度,并最终导致跳动的旋转和平移,特别是如果我们打算使用多个矩阵/四元数乘法。

回答

除非我们在做火箭科学,否则小数是WAAAY的过大杀伤力。尽管它可以为我们提供更精确的位置,但不一定会为我们提供更精确的(例如)速度,因为它是定点数据类型,因此被限制在比float或者double小的范围内。

使用浮子,但要确保精度不成问题,请保持开着的门向上移动至两倍的高度。