问题
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/
回答1:
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
回答2:
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?
回答3:
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
来源:https://stackoverflow.com/questions/24392062/finding-the-closest-difference-between-2-degrees-of-a-compass-javascript