2013-08-28 23 views
0

我試圖計算一個直角三角形的角度值。兩側是相反的,斜邊恰好與角度相鄰。用Java編寫的一個代碼使用atan2來獲得角度。當我在C中使用atan2時,我得到了不同的值。我獲得正確值的唯一方法是使用asin。爲什麼atan2給我asin不同的價值?

下面是在C代碼片段:

for(i = 0; i < n; i++) 
{ 
    m = sqrt((x - l[i].x) * (x - l[i].x) + (y * y)); 

    dist = abs(x - l[i].x); 

    ang = asin(dist/m) * 180.0/3.14159265; 

    if(ang <= (l[i].a + .01)) 
     total += (double) l[i].I/(m*m); 
} 

這裏是用Java代碼片段:

for (j = 0; j < n; j++) 
    { 
     d = Math.sqrt((xs - lights[j]) * (xs - lights[j]) + (ys * ys)); 

     w = Math.abs(xs - lights[j]); 

     ang = Math.atan2(w, ys) * 180.0/3.14159265; 

     if (ang <= angles[j] + 0.01) 
     { 
      total += (double) intensities[j]/(d * d); 
     } 
    } 

任何人都可以擺脫對這個問題的一些輕?

+1

因爲atan2!= asin !! –

+0

但是在Java中使用atan2給了我與在C中使用asin相同的角度。爲什麼?在C中使用atan2給了我一個與在Java中使用atan2不同的角度。爲什麼?! – user2723636

回答

0

相反/斜邊=正弦,因此應該使用ASIN得到的角度。

+0

但是在Java中如何使用atan2對於獲得相同的角度工作得很好? – user2723636

0

(見下面建立的條件)

OP問:「在Java中使用ATAN2給我相同的角度爲C.用ASIN爲什麼?」。
這就是sin(ang)= opposite/hypotenuse = dist/m和tan(ang)= opposite/adjacent = w/ys。

OP問:「使用C中的ATAN2讓我比使用Java中的ATAN2爲什麼一個不同的角度。?」
這是很多麻煩,因爲OP 沒有張貼有問題的代碼。 OP沒有說明這些不同值中的一些是或提供了測試數據。我們留下了受過教育的猜測。

的第一直覺是OP沒有按照正確的順序用C atan2()參數。 C和Java以相同的順序(y,x)使用atan2()。 Excel使用(x,y)順序。鑑於OP使用名爲y的變量作爲x參數,這是合理的。

第二個想法是OP沒有用C應該已經atan2(dist, y)使用相同的側面。

3想法有一個跡象(未正弦)問題。需要測試數據。


沒有與其他代碼微妙的問題,比如爲什麼要用3.14159265,而不是M_PI?如果dist/m剛好在1.0以上(舍入問題),會發生什麼?


鑑於與
高度A = dist = abs(x - l[i].x)w = abs(xs - lights[j])
寬度B = yys
斜邊C = md
角度ang相反側的

ang是直角三角形asin(dist/m)
ang is atan(w/ys)= atan2(w,ys)

相關問題