/// <summary> /// Returns new geodetic coordinate in radians /// </summary> /// <param name="lat1">Latitude in radians</param> /// <param name="lon1">Longitude in radians</param> /// <param name="crs12">Bearing</param> /// <param name="d12">Distance</param> /// <returns>double[]</returns> public static double[] Direct(double lat1, double lon1, double crs12, double d12) { lon1 *= -1; //REVERSE LONG FOR CALC 2.1.1.1 var EPS = 0.00000000005; //Used to determine if near pole. double dlon, lat, lon; d12 = d12 * 0.0005399565; //convert meter to nm d12 = d12 / (180 * 60 / Math.PI); //Convert to Radian //Determine if near pole if ((Math.Abs(Math.Cos(lat1)) < EPS) && !(Math.Abs(Math.Sin(crs12)) < EPS)) { Debug.WriteLine("Warning: Location is at earth's pole. Only N-S courses are meaningful at this location."); } lat = Math.Asin(Math.Sin(lat1) * Math.Cos(d12) + Math.Cos(lat1) * Math.Sin(d12) * Math.Cos(crs12)); if (Math.Abs(Math.Cos(lat)) < EPS) { lon = 0.0; //endpoint a pole } else { dlon = Math.Atan2(Math.Sin(crs12) * Math.Sin(d12) * Math.Cos(lat1), Math.Cos(d12) - Math.Sin(lat1) * Math.Sin(lat)); lon = ModM.Mod(lon1 - dlon + Math.PI, 2 * Math.PI) - Math.PI; } return(new double[] { lat, lon }); }