using System; using System.ComponentModel; namespace CoordinateSharp { /// /// Cartesian (X, Y, Z) Coordinate /// [Serializable] public class Cartesian : INotifyPropertyChanged { /// /// Create a Cartesian Object /// /// public Cartesian(Coordinate c) { //formulas: x = Math.Cos(c.Latitude.ToRadians()) * Math.Cos(c.Longitude.ToRadians()); y = Math.Cos(c.Latitude.ToRadians()) * Math.Sin(c.Longitude.ToRadians()); z = Math.Sin(c.Latitude.ToRadians()); } /// /// Create a Cartesian Object /// /// X /// Y /// Z public Cartesian(double xc, double yc, double zc) { //formulas: x = xc; y = yc; z = zc; } /// /// Updates Cartesian Values /// /// public void ToCartesian(Coordinate c) { x = Math.Cos(c.Latitude.ToRadians()) * Math.Cos(c.Longitude.ToRadians()); y = Math.Cos(c.Latitude.ToRadians()) * Math.Sin(c.Longitude.ToRadians()); z = Math.Sin(c.Latitude.ToRadians()); } private double x; private double y; private double z; /// /// X Coordinate /// public double X { get { return x; } set { if(x != value) { x = value; NotifyPropertyChanged("X"); } } } /// /// y Coordinate /// public double Y { get { return y; } set { if (y != value) { y = value; NotifyPropertyChanged("Y"); } } } /// /// Z Coordinate /// public double Z { get { return z; } set { if (z != value) { z = value; NotifyPropertyChanged("Z"); } } } /// /// Returns a Lat Long Coordinate object based on the provided Cartesian Coordinate /// /// X /// Y /// Z /// public static Coordinate CartesianToLatLong(double x, double y, double z) { double lon = Math.Atan2(y, x); double hyp = Math.Sqrt(x * x + y * y); double lat = Math.Atan2(z, hyp); double Lat = lat * (180 / Math.PI); double Lon = lon * (180 / Math.PI); return new Coordinate(Lat, Lon); } /// /// Returns a Lat Long Coordinate object based on the provided Cartesian Coordinate /// /// Cartesian Coordinate /// public static Coordinate CartesianToLatLong(Cartesian cart) { double x = cart.X; double y = cart.Y; double z = cart.Z; double lon = Math.Atan2(y, x); double hyp = Math.Sqrt(x * x + y * y); double lat = Math.Atan2(z, hyp); double Lat = lat * (180 / Math.PI); double Lon = lon * (180 / Math.PI); return new Coordinate(Lat, Lon); } /// /// Cartesian Default String Format /// /// Cartesian Formatted Coordinate String /// Values rounded to the 8th place public override string ToString() { return Math.Round(x,8).ToString() + " " + Math.Round(y, 8).ToString() + " " + Math.Round(z, 8).ToString(); } /// /// Property changed event /// public event PropertyChangedEventHandler PropertyChanged; /// /// Notify property changed /// /// Property name public void NotifyPropertyChanged(string propName) { if (this.PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } } }