Timothy von Hollen
Timothy von Hollen

Reputation: 135

Finding the closest difference between 2 degrees of a compass - Javascript

I'm basically trying to find how many degrees apart two points of a compass are. For example if a person is facing 270 and their compass is 280 there are 10 degrees between those 2 points. I'd also like a negative number if it's to the left and positive to the right, relative to the 1st heading.

The problem comes when the to headings are 350 and 020 for example. These two points are 30 degrees apart but would give a result of -330.

Below is an example of my code:

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>

I'm sure there is some simple math function I'm missing, I just can't seem to figure it out.

Here is a jsfiddle link http://jsfiddle.net/dTmPn/3/

Upvotes: 1

Views: 1462

Answers (3)

Math chiller
Math chiller

Reputation: 4167

im not sure how you expect it to work, (which it doesnt i tried 10-30 and got 19.999996) but this would be the general idea based on your code.

sum1 = ConvertToDegrees((ConvertToRadians(_Heading2) - ConvertToRadians(_Heading1)));
sum2 = ConvertToDegrees((ConvertToRadians(_Heading1) - ConvertToRadians(_Heading2)));

return sum1 < sum2 ? sum1 : sum2;

this does you calculation twice in opposite directions and returns the smaller sum.

i would do it like this:

function GetHeadingDiff(s1, s2)
{  
    r1 = (s1 - s2 + 360 ) % 360;
    r2 = (s2 - s1 + 360 ) % 360;

    return r1<r2?r1:r2;
}

fiddle

Upvotes: 0

Matt
Matt

Reputation: 20796

function GetHeadingDiff(_Heading1, _Heading2)
{   
    return (_Heading2-_Heading1+540) % 360 - 180;
}

Examples:

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

Upvotes: 14

user3754372
user3754372

Reputation: 187

first of, why are you doing back and forth conversion of radians and degrees? look at this. http://jsfiddle.net/dTmPn/5/

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

is that enough?

Upvotes: 2

Related Questions