4

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

4

2 回答 2

2

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

在此处输入图像描述

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

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

您可能会得到以下几个原因NaN

  • 您的边长之一是负数,因此当您将其平方根时,您会收到NaN.
  • 根据您指定的边长,您的三角形不可能真正存在。查看此文档以了解acos

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

于 2012-11-20T16:54:36.147 回答
1

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

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.

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

于 2012-11-20T17:11:17.387 回答