【问题标题】:Processing - rule of cosines (sss) - NaN处理 - 余弦规则 (​​sss) - NaN
【发布时间】:2012-11-08 19:18:40
【问题描述】:

我正在开发一个带有 Processing 的简单反向运动学 delta 机器人控制器。我被余弦规则困住了。我有三个边的长度,并希望得到角度。但是float angle = acos((sq(humerus)+sq(ulna) - sq(radius))/(2 * humerus * ulna)); 总是返回 NaN。有什么想法吗?

【问题讨论】:

    标签: java processing trigonometry nan


    【解决方案1】:

    如果您检查 Math.acos 的 javadoc,您会看到以下内容:

    If the argument is NaN or its absolute value is greater than 1, then the result is NaN.
    

    所以,有两种可能:

    1. 分子的绝对值大于分母,导致分数超过 1.0。因此,反余弦将返回 NaN。

    2. 其中一个平方根返回一个 NaN。正如我们从javadoc看到的:If the argument is NaN or less than zero, then the result is NaN.

    所以,我会检查你的肱骨、桡骨和尺骨的值。您可能允许分子稍大(例如,通过浮点错误),或者您的手臂骨骼测量值使用矢量而不是标量值(导致平方根的参数为负而不是正)。

    【讨论】:

      【解决方案2】:

      如果你知道边,你可能想使用 余弦定律

      在 Java 术语中,要求解角度 C(与长度的边 c 相对),我们将有

      Math.acos((a*a + b*b - c*c) / (2*a*b))
      

      您可能会收到NaN 的原因有几个:

      • 你的边长之一是负数,所以当你把它平方根时你会收到NaN
      • 根据您指定的边长,您的三角形实际上并不存在。查看acos 的此文档:

        如果参数为NaN或其绝对值大于1,则结果为NaN

      【讨论】:

      • 哎呀,我的标题搞混了,我使用的是余弦定律。问题是它返回一个 NaN。
      • 好的,感谢您的帮助。如果我将我的所有值缩放为浮点数 0-1,它应该可以工作吗?我所有的维度都是正面的。
      • @bob_walter 不一定,这取决于边长的相对大小。见this
      • 关于边长...为了更明确一点,您必须有|a| + |b| > |c||b| + |c| > |a||c| + |a| > |b| 才能拥有三角形(将> 替换为@987654337 @ 表示所有边共线的退化三角形)。
      • 啊,又是开发者错误。谢谢大家帮忙!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      相关资源
      最近更新 更多