2017-06-02 47 views
0

我正在做的用例是根據當前軸承在當前位置顯示POI。例如,如果我前往北部,則不會顯示來自南部的POI,但只會根據閾值內的方位顯示POI。如果POI在閾值範圍內,計算GPS軸承

Representation

Degrees

+0

所以你需要找到兩個軸承(角度)的差異? – MBo

+0

是的,類似的東西。我需要檢查POI是否在x1,x2的範圍內。 – neilQ5

回答

1

爲了避免問題360/0過渡,你可以使用一個條件佔週期性

if (Cos(Bearing) * Cos(POI) + Sin(Bearing) * Sin(POI) > Cos(Threshold)) then 
    POI direction lies in range Bearing +- Threshold 
+0

我用這個計算來獲得軸承和度數。數學公式(Math.toDegrees(Math.atan2(y,x));其中, double fValue = degrees <0d? (度數+ = 360d):度;' 我應該在做計算之前做一些轉換嗎? – neilQ5

+0

是的,你應該把度數轉換成弧度。但是你確定'atan2(y,x)'對地理座標很好嗎? – MBo

+0

謝謝@MBo。是它正在按原樣運行。該角度以歸一化爲[0,360]度的角度表示。和北方參考360度。我添加了一張圖片。 – neilQ5

0

這裏是我的解決方案現在。在努力簡化它。歡迎提出建議。

public static boolean isBearingWithinRange(double heading, double alertHeading, double threshold) { 
    boolean status = false; 
    double leftThresholdMin = heading - threshold; 
    double leftThresholdMax = FULL_CIRCLE; 
    double rightThresholdMin = 0.0d; 
    double rightThresholdMax = 0.0d; 

    double total = heading + threshold; 

    if(total > FULL_CIRCLE) { 
     rightThresholdMax = threshold - (FULL_CIRCLE - heading); 

     if((alertHeading >= leftThresholdMin && alertHeading <= leftThresholdMax) || 
       (alertHeading >= rightThresholdMin && alertHeading <= rightThresholdMax)) { 
      status = true; 
     } 

    } else if(heading < threshold) { 
     double diff = (threshold - heading); 
     leftThresholdMin = FULL_CIRCLE - diff; 
     rightThresholdMax = threshold + heading; 

     if((alertHeading >= leftThresholdMin && alertHeading <= leftThresholdMax) || 
     (alertHeading >= rightThresholdMin && alertHeading <= rightThresholdMax)) { 
      status = true; 
     } 

    } else { 
     rightThresholdMax = heading + threshold; 

     if(alertHeading >= leftThresholdMin && alertHeading <= rightThresholdMax) { 
      status = true; 
     } 
    } 
    return status; 
}