10

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

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

另外,在 t 和 t+1 之间我能得到的最短时间是多少?一勾?

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

4

8 回答 8

9

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

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

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

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

于 2008-08-26T19:27:49.203 回答
9

Decimal 数据类型虽然精确,但可能不是最佳选择,具体取决于您要执行的操作。通常 Direct3D 和 GPU 使用 32 位浮点数和 3 个向量(总共 96 位)来表示 x、y、z 中的位置。

这通常会提供足够的精度,除非您需要在同一个“世界”中混合巨大规模(行星)和微观层面(篮球)。

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

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

于 2008-08-26T19:57:59.147 回答
5

除非你在做火箭科学,否则小数太夸张了。尽管它可能会为您提供更精确的位置,但不一定会为您提供更精确的(例如)速度,因为它是定点数据类型,因此限制在比浮点数或双精度数小得多的范围内。

使用浮点数,但如果精度出现问题,请打开门以向上移动双倍。

于 2008-09-19T18:10:02.237 回答
3

我会使用 Vector 数据类型。就像在物理学中一样,当您想对物体运动进行建模时,您可以使用向量。使用 XNA 框架之外的Vector2Vector3 类或滚动您自己的 Vector3 结构来表示位置。Vector2 用于 2D,Vector3 用于 3D。

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

于 2008-08-26T22:47:17.290 回答
0

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

编辑:

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

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

于 2008-08-26T19:26:42.670 回答
0

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

是的,一个刻度是我所知道的最小的(使用 System.Diagnostics.Stopwatch 类)。

于 2008-08-26T19:28:22.040 回答
0

对于模拟,您最好在无量纲时间内使用小数/双精度(与位置相同的类型),然后将其从/转换为对输入/输出有意义的东西。否则,当您四处移动时,您将执行大量的演员操作。您也可以通过这种方式获得任意精度,因为您可以根据需要选择大/小时间刻度。

于 2008-08-26T19:35:47.763 回答
0

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

另外,不要使用比浮点精度低的任何东西——现在所有处理器的运行速度都足够快,比整数更准确(除非它是用于移动设备的,但即使在那里......)使用小于浮点数你会很快失去精度并且最终会出现跳跃的旋转和平移,特别是如果您打算使用多个矩阵/四元数乘法。

于 2008-09-17T17:39:03.413 回答