【发布时间】: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
我正在开发一个带有 Processing 的简单反向运动学 delta 机器人控制器。我被余弦规则困住了。我有三个边的长度,并希望得到角度。但是float angle = acos((sq(humerus)+sq(ulna) - sq(radius))/(2 * humerus * ulna));
总是返回 NaN。有什么想法吗?
【问题讨论】:
标签: java processing trigonometry nan
如果您检查 Math.acos 的 javadoc,您会看到以下内容:
If the argument is NaN or its absolute value is greater than 1, then the result is NaN.
所以,有两种可能:
分子的绝对值大于分母,导致分数超过 1.0。因此,反余弦将返回 NaN。
其中一个平方根返回一个 NaN。正如我们从javadoc看到的:If the argument is NaN or less than zero, then the result is NaN.
所以,我会检查你的肱骨、桡骨和尺骨的值。您可能允许分子稍大(例如,通过浮点错误),或者您的手臂骨骼测量值使用矢量而不是标量值(导致平方根的参数为负而不是正)。
【讨论】:
如果你知道边,你可能想使用 余弦定律:
在 Java 术语中,要求解角度 C(与长度的边 c 相对),我们将有
Math.acos((a*a + b*b - c*c) / (2*a*b))
您可能会收到NaN 的原因有几个:
NaN。acos 的此文档:
如果参数为
NaN或其绝对值大于1,则结果为NaN。
【讨论】:
|a| + |b| > |c|、|b| + |c| > |a| 和|c| + |a| > |b| 才能拥有三角形(将> 替换为@987654337 @ 表示所有边共线的退化三角形)。