2012-11-20 25 views
4

我正在處理一個簡單的反向運動學增量機器人控制器。我陷入了餘弦的規則。我有三面的長度,並希望獲得角度。但是float angle = acos((sq(humerus)+sq(ulna) - sq(radius))/(2 * humerus * ulna)); 總是返回NaN。有任何想法嗎?處理 - 餘弦準則(sss) - NaN

回答

2

您可能需要使用的餘弦法律,如果你知道雙方:

enter image description here

在Java方面,對角度解決C(相對於長邊c)我們將有

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

有幾個原因,你可能會得到NaN

  • 你的一個邊長爲負,所以當你平方根它您將收到NaN
  • 根據您指定的邊長,您的三角形不能真正存在。看看這個文檔acos

    如果參數爲NaN或它的絕對值大於1,那麼結果是NaN

+0

啊我的不好,我混在了標題中,我正在使用餘弦定律。問題是它返回一個NaN。 –

+0

@bob_walter查看我的編輯 – arshajii

+0

好的,謝謝你的幫助。如果我將所有的值都放在浮點數0-1中,它應該工作嗎?我所有的維度都是正面的。 –

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.

所以,我會檢查你的肱骨,橈骨和尺骨值。您可能允許分子稍微過大(例如,通過浮點錯誤),或者您的手臂骨骼測量值具有矢量而非標量值(導致平方根爲負值而不是正值)。