2017-06-02 43 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; 
}