2016-04-08 58 views
0

當我嘗試在程序中獲取矢量的方向時,我的if語句無法正常工作。如果語句沒有按照我想要的那樣做

問題是,當我輸入的< -1向量,1>

我得到45°而不是125°

源代碼

import java.util.*; 
import java.math.*; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     //Decloration 
     Scanner in = new Scanner(System.in); 
     int rty; 
     double v1; 
     double v2; 
     double dir; 
     double mag; 
     double V1; 
     double V2; 

     do { 
     //Input 
       System.out.println("Please input x"); 
     v1 = in.nextDouble(); 
     System.out.println("Please input y"); 
     v2 = in.nextDouble(); 

     //Calculating 
     dir = Math.toDegrees(Math.atan(v2/v1)); 
     if (v1 >= 0) { 
      if (v2 < 0) { 
       dir+=270; 
      } 
     } else { 
      if (v2 < 0) { 
       dir+=180; 
      } else { 
       dir+=90; 
      } 
     } 
     mag = Math.sqrt((v1*v1)+(v2*v2)); 
     V1 = v1/mag; 
     V2 = v2/mag; 

     //Output 
     System.out.println("The unit vector is <" + V1 +", " + V2 + ">"); 
     System.out.println("The magnitude is " + mag); 
     System.out.println("The direction is " + dir); 
     System.out.println("\n\nRty?"); 

     //Quit 
     rty = in.nextInt(); 
     System.out.println("\n"); 
     dir = 0; 
     } while (rty == 1); 
    } 
} 

有誰知道什麼是錯?

+2

首先,你可能想'數學。 atan2(v2,v1)'。 –

+1

使用調試器。 – redFIVE

回答

0

對於v1v2中至少有一個爲負的所有情況,您的邏輯不正確。該atan method Javadocs狀態:

返回的角度範圍在-pi/2到pi/2

因此,如果一個值v10或正,v2是否定的,你會風(-45),您應該添加360度,以便輸入(1,-1)爲325度。

如果v1的值爲負值且v2爲正數,則結束時的值與上述情況相同,但您需要相反的方向。在這裏增加180度。

如果v1v2均爲負數,您將得到的度數值爲45,因此在此處添加180是正確的。

這裏是更新的邏輯:

if (v1 >= 0) { 
    if (v2 < 0) { 
     dir += 360; 
    } 
} else { 
    dir += 180; 
} 

這將讓你的135度,不125,正確的值(-1,1)。

但是,在整個-pi到+ pi範圍內獲取度數(或原始弧度)的範圍是Math.atan2的工作。它需要極座標,這是v1v2

...計算在-pi到pi範圍內y/x的反正切。

dir = Math.toDegrees(Math.atan2(v2, v1)); 

轉換成度之後,你仍然要添加360度如果dir爲負。的邏輯是簡單的:

if (dir < 0) { 
    dir += 360; 
} 
0

從文檔,atan(double a)

返回一個值的反正切;返回的角度在-pi/2到pi/2的範圍內。

從文檔,atan2(double a)

返回從直角座標(X,Y)爲極座標(R,θ-)的轉化率的角度theta。該方法通過計算在-pi到pi範圍內的y/x的反正切計算相位θ。

使用atan將縮小您的答案pi以使其進入功能返回值的範圍。切換到atan2將解決因爲笛卡爾座標轉換爲極座標。您當然可以使用toDegrees函數。

+0

可能想檢查返回的度數是否定的。如果是這樣的話,可以放大360倍。我認爲如果你自己解決這個問題最好。 :) –

0

Math.toDegrees(Math.atan(v2/v1)收益-45,然後你要添加90,所以它會給45.

爲了您的if語句這應該工作:

Math.toDegrees(Math.atan(Math.abs(v2/v1)) 
相關問題