Ivan T - 7 months ago 48

Java Question

I implemented the "bearing" formula from http://www.movable-type.co.uk/scripts/latlong.html. But it seems highly inaccurate - I suspect some mistakes in my implementation. Could you help me with finding it? My code is below:

`protected static double bearing(double lat1, double lon1, double lat2, double lon2){`

double longDiff= lon2-lon1;

double y = Math.sin(longDiff)*Math.cos(lat2);

double x = Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(longDiff);

return Math.toDegrees((Math.atan2(y, x))+360)%360;

}

Answer

You just have your parentheses `()`

in the wrong place.

You are adding degrees to a value in radians, which won't work. `toDegrees()`

will do the conversion from radians to degrees for you, *then* you do the normalisation once you have a value in degrees.

You have:

```
Math.toDegrees( (Math.atan2(y, x))+360 ) % 360;
```

But you need:

```
( Math.toDegrees(Math.atan2(y, x)) + 360 ) % 360;
```

Remember also that all inputs to `Math.sin()`

, `Math.cos()`

and all the other trigonometric functions must be in radians. If your inputs are degrees you'll need to convert them using `Math.toRadians()`

first.