public Vector3(IPointGeo sphericalPoint) { double lat = Math.PI / 2 - Calculations.ToRadians(sphericalPoint.Latitude); double lon = Calculations.ToRadians(sphericalPoint.Longitude); X = Math.Sin(lat) * Math.Cos(lon); Y = Math.Sin(lat) * Math.Sin(lon); Z = Math.Cos(lat); }
/// <summary> /// Translates point in the specific direction by specific distance /// </summary> /// <param name="point">The point to be translated</param> /// <param name="bearing">Bearing from the original point</param> /// <param name="distance">Distance from the original point</param> /// <returns>the translated point</returns> public static PointGeo ProjectPoint(IPointGeo point, double bearing, double distance) { double lat = Math.Asin(Math.Sin(Calculations.ToRadians(point.Latitude)) * Math.Cos(distance / Calculations.EarthRadius) + Math.Cos(Calculations.ToRadians(point.Latitude)) * Math.Sin(distance / Calculations.EarthRadius) * Math.Cos(Calculations.ToRadians(bearing))); double lon = Calculations.ToRadians(point.Longitude) + Math.Atan2(Math.Sin(Calculations.ToRadians(bearing)) * Math.Sin(distance / Calculations.EarthRadius) * Math.Cos(Calculations.ToRadians(point.Latitude)), Math.Cos(distance / Calculations.EarthRadius) - Math.Sin(Calculations.ToRadians(point.Latitude)) * Math.Sin(lat)); return(new PointGeo(Calculations.ToDegrees(lat), Calculations.ToDegrees(lon))); }
public static double GetBearing(IPointGeo pt1, IPointGeo pt2) { double dLon = Calculations.ToRadians(pt1.Longitude - pt2.Longitude); double dLat = Calculations.ToRadians(pt1.Latitude - pt2.Latitude); double y = Math.Sin(dLon) * Math.Cos(Calculations.ToRadians(pt2.Latitude)); double x = Math.Cos(Calculations.ToRadians(pt1.Latitude)) * Math.Sin(Calculations.ToRadians(pt2.Latitude)) - Math.Sin(Calculations.ToRadians(pt1.Latitude)) * Math.Cos(Calculations.ToRadians(pt2.Latitude)) * Math.Cos(dLon); return(Calculations.ToDegrees(Math.Atan2(y, x))); }