【问题标题】:Finding the closest difference between 2 degrees of a compass - Javascript找到指南针 2 度之间的最接近差异 - Javascript
【发布时间】:2014-06-24 16:44:01
【问题描述】:

我基本上是想找出指南针的两点相距多少度。例如,如果一个人面向 270,而他们的指南针是 280,那么这 2 点之间有 10 度。我也想要一个负数,如果它在左边,在右边,相对于第一个标题。

例如,当 to 标题为 350 和 020 时,问题就出现了。这两点相距 30 度,但结果为 -330。

下面是我的代码示例:

function ConvertToRadians(_var)
{
    return _var * (Math.PI/180);
}
function ConvertToDegrees(_var)
{
    return _var * (180/Math.PI);
}
function GetHeadingDiff(_Heading1, _Heading2)
{   
    return ConvertToDegrees((ConvertToRadians(_Heading2) - ConvertToRadians(_Heading1)));
}

$(document).ready(function (){
    $('#process').click(function (e){
        e.preventDefault();
        var Hdg1 = parseFloat($('#heading1').val());
        var Hdg2 = parseFloat($('#heading2').val());
        $('#results').html(GetHeadingDiff(Hdg1,Hdg2));
    });
});

<input id="heading1" type="text" />
<input id="heading2" type="text" />
<button id="process" type="button">Submit</button>
<div id="results">
</div>

我确定我缺少一些简单的数学函数,但我似乎无法弄清楚。

这是一个jsfiddle链接http://jsfiddle.net/dTmPn/3/

【问题讨论】:

  • 你想要两个更接近的那么
  • 负数是什么意思?我不明白“如果它在左边”或“如果它在右边”。有 2 个点,所以一个总是在左边,一个总是在右边。
  • Archer 我想他想要两个更接近的人
  • 是的,两者越接近。如果它与第一个标题相关,那也很棒。例如,如果第一个标题是 280,第二个标题是 270,那么它将是 -10。我想我总是可以为此编写另一种方法。

标签: javascript jquery html radians


【解决方案1】:
function GetHeadingDiff(_Heading1, _Heading2)
{   
    return (_Heading2-_Heading1+540) % 360 - 180;
}

例子:

GetHeadingDiff( 280, 270 )
-10
GetHeadingDiff( 270, 280 )
10
GetHeadingDiff( 350, 20 )
30
GetHeadingDiff( 20, 350 )
-30

【讨论】:

    【解决方案2】:

    首先,你为什么要做弧度和度数的来回转换? 看这个。 http://jsfiddle.net/dTmPn/5/

    var diff = _Heading2-_Heading1;
    if(diff>180) diff-=360;
    if(diff<-180) diff+=360;
    return diff;
    

    够了吗?

    【讨论】:

    • 完美。我增加了不必要的复杂性。谢谢。
    【解决方案3】:

    我不确定您期望它如何工作(我没有尝试 10-30 并得到 19.999996),但这将是基于您的代码的一般想法。

    sum1 = ConvertToDegrees((ConvertToRadians(_Heading2) - ConvertToRadians(_Heading1)));
    sum2 = ConvertToDegrees((ConvertToRadians(_Heading1) - ConvertToRadians(_Heading2)));
    
    return sum1 < sum2 ? sum1 : sum2;
    

    这会在相反方向计算两次并返回较小的总和。

    我会这样做:

    function GetHeadingDiff(s1, s2)
    {  
        r1 = (s1 - s2 + 360 ) % 360;
        r2 = (s2 - s1 + 360 ) % 360;
    
        return r1<r2?r1:r2;
    }
    

    fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2014-12-29
      相关资源
      最近更新 更多