【问题标题】:Return a Value between 1 & 360返回 1 到 360 之间的值
【发布时间】:2020-04-13 18:58:13
【问题描述】:

我有一个函数设置为返回一个在 Quaternin Rotation 中使用的值。但是,当我的 reslt 小于 1 或非常接近 360 时,我会收到 -nan(ind) 的结果。有没有办法在 1 和 360 之间返回结论性结果,以避免计算中的任何错误。谢谢

const float ReturnAngle() const
{
    return (acosf(angle) * 180.0f * 2) / PI;
}

更新:

这些是我在对四元数应用变换旋转后检查值时收到的一些结果。

angle: 359.598
angle: -nan(ind)
angle: 357.843


angle: -nan(ind)
angle: -nan(ind)
angle: 0.798189
angle: 2.16383
angle: 1.75475
angle: -nan(ind)

【问题讨论】:

  • 当你“得到的结果小于 1 或非常接近 360”时,你不会遇到问题;那是angle,不管是什么,都有一定的价值。编写你能想出的最小的程序来编译和运行并显示问题。
  • 注意acos的输入不能是角度,而是-1到1之间的余弦值
  • 您的问题可能来自angle = 1.000001,带有任何 +/- 符号
  • 将此行添加到您的代码static_assert(angle > 1.0 || angle < -1.0, "Wrong angle input");
  • 如果您不希望这样做会失败,将值限制为 -1.0 或 1.0 可能更有意义,否则您将需要来自 的常规 assert(angle > 1.0 || angle < -1.0)static_assert 不起作用,因为angle 不是编译时值,它似乎是一个类成员变量。

标签: c++ math rotation trigonometry quaternions


【解决方案1】:

您传递给acosf 的值超出了-1 到1 的允许范围。请查看为angle 设置值的代码 - 也许您有错误。如果它只是一个舍入误差,并且angle 超出了允许范围一个很小的值,那么将其“钳制”到有效范围可能是一个很好的解决方案。

const float ReturnAngle() const
{
    if (angle < -1f) angle = -1f;
    if (angle > +1f) angle = +1f;
    return (acosf(angle) * 180.0f * 2) / PI;
}


【讨论】:

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