我正在使用 Processing 开发一个简单的逆运动学 delta 机器人控制器。我被困在余弦规则。我有三个边的长度,希望得到角度。但float angle = acos((sq(humerus)+sq(ulna) - sq(radius))/(2 * humerus * ulna));
总是返回 NaN。有什么想法吗?
如果你知道两边,你可能想使用余弦定律:
在 Java 术语中,为了求解角度C
(与长度c
的边相对),我们将有
Math.acos((a*a + b*b - c*c) / (2*a*b))
有几个原因,你可以得到NaN
:
你的一个边长是负的,所以当你的平方根,你收到NaN
。
根据您指定的边长,您的三角形不能真正存在。查看此文档acos
:
如果参数为NaN
或其绝对值大于1
,则结果为NaN
。
如果您检查 javadocMath.acos,您会看到以下内容:
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.
所以,我会检查你的肱骨,桡骨和尺骨的值。你可能允许一个稍微太大的分子(例如,通过浮点误差),或者你有一个向量而不是一个标量值用于你的臂骨测量(导致平方根的负数而不是正数)。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(74条)