【问题标题】:Datatypes for physics物理数据类型
【发布时间】:2010-09-06 22:22:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# types physics


    【解决方案1】:

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

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

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

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

    【讨论】:

    • -1:小数很少用于任何 3D 游戏计算,它们太慢了。使用由 3 个浮点数构建的 Vector 类,一切就绪。
    • +1:对于实数类型,十进制是最精确的,这就是所要求的。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • +1:用 3 个浮点数构建的向量在 D3D 中是相当标准的。除非您需要更高的准确性,否则我不会使用小数,但如果它只是一个游戏,我不会担心。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我会使用 Vector 数据类型。就像在物理学中一样,当您想对物体运动进行建模时,您可以使用向量。使用Vector2Vector3 class out of the XNA 框架或滚动您的own Vector3 struct 来代表位置。 Vector2 用于 2D,Vector3 用于 3D。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          编辑:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 2010-10-25
                • 2010-12-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-23
                • 1970-01-01
                • 2015-12-13
                相关资源
                最近更新 更多