【问题标题】:Trying to create function that interpolates a float to zero尝试创建将浮点数内插为零的函数
【发布时间】:2018-10-13 18:40:52
【问题描述】:

我正在尝试创建一个平滑函数来将一个数字内插为零。问题是,它不起作用。在这种情况下,如果我将一个数字增加 0.01 指定次数,我想将该数字减少 0.02 直到它为零。这是我的功能。

float ReduceSpeed(float x)
{
    if (x != 0f)
    {
        if (x % 0.02f != 0 && x > 0)
        {
            x = x - 0.01f;
        } else if (x % 0.02f != 0 && x < 0)
        {
            x = x + 0.01f;
        }
        else
        {
            if (x > 0f)
            {
                x = x - 0.02f;
            }
            else
            {
                x = x + 0.02f;
            }
        }
    }
    return x;
}

我想用它来创造一种统一的滑动动作。

【问题讨论】:

  • 不要对浮点数使用模 (%) 运算符,除非你真的需要它并且知道它的局限性。几乎从不需要它。
  • 您有什么理由避免使用 Lerp 或 SmoothDamp?

标签: c# unity3d lerp


【解决方案1】:

问题很可能出在一行

if (x != 0f)

x 很可能由于舍入误差而不完全为零,因为 0.01 和 0.02 是以 2 为底的周期数。您应该选择一个较小的值 (epsilon) 来比较 x 的绝对值反对,例如

if (Math.Abs(x) < 1E-10)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多