2017-09-24 133 views
-1

想象一下,我在屏幕上畫了一箇中心座標爲(cx,cy)的圓,並在圓上選擇了一個隨機點(A)。查找圓上的點的角度

trigonometric circle

通過具有點A的座標,我需要知道的角(α)。

更新:

我已經使用以下公式嘗試:

Math.toDegrees(Math.asin(((x - cx)/radius).toDouble())) 

這實際上是相反(圓是通過將垂直於這一個創建):

x = radius * Math.sin(Math.toRadians(angle.toDouble())) + cx 
y = radius * Math.cos(Math.toRadians(angle.toDouble())) + cy 

但由於公式中不存在y座標,所以答案可能是錯誤的。

+0

看到'java.lang.Math'包文檔。你嘗試過^ F'角度嗎? – pskink

+1

在我的幾何類中,零度在圓的東側 –

回答

1

如果你知道點A(X,Y)的直角座標系,那麼你可以將它轉換成極座標如下找到θ角:

double theta = Math.toDegrees(Math.atan2(y - cy, x - cx)); 

該公式工作,如果你的X軸在0度,否則你需要考慮偏移量。

+0

謝謝,但問題在於這個公式無法正確區分象限。此公式始終返回從0到180的角度。 –

+0

您可以使用CAST規則計算出角度,例如。如果x和y都是正的,那麼角度是相同的,如果x和y都是負的,那麼角度就是theta + 180 –

+1

@HamedMomeni所以你檢查了'Math'軟件包文檔? *「這種方法通過計算y/x在-pi到pi範圍內的反正切來計算相位theta * – pskink

1

我認爲你正在尋找的方法是Math.atan2,它計算出一個x和y座標的角度。我現在修改了代碼以調整向下0度。我還翻轉y軸把0,0 cordinate在左上角(屏幕座標),和調整度以上180報告爲陰性度:

public double theta(int cx, int cy, int x, int y) 
{ 
    double angle = Math.toDegrees(Math.atan2(cy - y, x - cx)) + 90; 
    return angle <= 180? angle: angle - 360; 
} 

小測試,以驗證某些角度...

@Test 
public void test() 
{ 
    assertThat(theta(50, 50, 60, 50), is(90.0)); 
    assertThat(theta(50, 50, 50, 60), is(0.0)); 
    assertThat(theta(50, 50, 40, 50), is(-90.0)); 
    assertThat(theta(50, 50, 50, 40), is(180.0)); 
} 
+1

正確的答案,但...方向是相反的,並且起點由pi/2抵消 - 所以我不認爲OP接受它,因爲他想要魚,而不是魚竿 – pskink

-1

你可以找到切線的角度和從270增加90或substruct這個角度,找到的結果,我相信。我設計的代碼就像你的繪圖。我猜,你可以使它更通用。 你有4區:

  1. 0度到90度
  2. 90度至180度
  3. 90度到-90(270)度
  4. -90(270)度爲0(360 )學位

代碼:

public static double findAngle(double x, double y, 
           double cx, double cy, double radius){ 
    double beta, alfa; 

    double distanceX = Math.abs(Math.abs(x) - Math.abs(cx)); 
    double distanceY = Math.abs(Math.abs(y) - Math.abs(cy)); 

    // check the point is on the circle or not 
    // with euchlid 
    if (radius != Math.sqrt(x * x + y * y)) { 
     return -1; 
    } 

    if (x >= cx && y <= cy) { 
     // find tangent 
     beta = Math.atan(distanceY/distanceX); 
     alfa = 90 - beta; 
     return alfa; 
    } 
    // 90-180 -> second area 
    else if (x >= cx && y >= cy) { 
     beta = Math.atan(distanceY/distanceX); 
     alfa = 90 + beta; 
     return alfa; 
    } 
    // 180 - -90 -> third area 
    else if (x <= cx && y >= cy) { 
     beta = Math.atan(distanceY/distanceX); 
     alfa = 270 - beta; 
     return alfa; 
    } 
    // -90 - 0 -> forth area 
    else if (x <= cx && y <= cy) { 
     beta = Math.atan(distanceY/distanceX); 
     alfa = 270 + beta; 
     if (alfa == 360) { 
      alfa = 0; 
     } 
     return alfa;  
    } 
    else { 
     return -1; 
    } 
}