我目前正在设计一个涉及一些物理学的程序(没有太高深的内容,只是几个球互相碰撞)
在C#中,我可以使用哪种最精确的数据类型来表示位置(不会有离散跳跃的感觉)?
此外,我可以在t和t + 1之间获得多少最小时间?一个tick吗?
编辑:澄清一下:C#中最小的时间单位是什么?[TimeSpan].Tick
?
decimal
将是您在位置方面可以使用的最精确的数据类型。我会为位置编写一个类:public class Position
{
decimal x;
decimal y;
decimal z;
}
关于时间,您的处理器无法提供比一个时钟周期更小的时间单位。
听起来像是一个有趣的项目!祝你好运!
根据您的需求,精确但不一定是最佳选择的数据类型是十进制数据类型。通常,Direct3D和GPU使用32位浮点数以及3个向量(总计96位)来表示x,y,z位置。
这通常会提供足够的精度,除非您需要在同一个“世界”中混合大规模(行星)和微观水平(篮球)。
不使用十进制的原因可能是大小(4倍),速度(数量级更慢)以及没有三角函数可用(据我所知)。
在Windows上,QueryPerformanceCounter API函数将为您提供最高分辨率时钟,QueryPerformanceFrequency则提供计数器的频率。我相信在其他评论中描述的Stopwatch将此包装在.net类中。
除非你在做火箭科学,否则十进制数是完全不必要的。虽然它可能会给你更精确的位置,但它并不一定会给你更精确的速度,因为它是一个固定点数据类型,因此其范围比浮点数或双精度浮点数小得多。
使用浮点数,但保持开放态度,以便在精度成为问题时转向双精度浮点数。
嘿,Juan,我建议你像其他人建议的那样使用Vector3类,因为它易于使用,并且最重要的是 - 支持你需要的所有操作(如加法,乘法,矩阵乘法等...)而无需自己实现。 如果你对如何进行有任何疑问 - 继承它,稍后你总是可以更改内部实现,或者与vector3断开连接。
此外,不要使用比float更不准确的东西 - 所有处理器现在运行得足够快,以至于比整数更准确(除非它是为移动设备设计的,但即使在那里...) 使用小于float的值会很快失去精度,并且最终会出现跳跃的旋转和平移,特别是如果您计划使用多个矩阵/四元数乘法。
我不确定我理解你上一个问题的意思,能否请你澄清一下?
编辑:
我可能还是不太明白,但是你可以使用任何类型(例如double)来表示时间(如果你实际想要表示物理问题中时间的离散化,那么tick就无关紧要了)。对于大多数物理问题,double应该足够了。
tick是使用计算机测量时间时可以达到的最佳精度。
我认为你应该可以毫无问题地使用十进制数据类型。它具有最高的精度。然而,双精度数据类型也应该可以胜任。
是的,据我所知,滴答是最小的时间单位(使用System.Diagnostics.Stopwatch类)。
对于模拟,最好使用十进制/双精度(与位置相同的类型)来表示无量纲时间,并在输入/输出时将其转换为/自有意义。否则,当你移动东西时,你会执行大量的强制转换操作。这种方式还可以获得任意精度,因为你可以选择所需的时间尺度大小。