| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | using System;namespace InABox.Core{    public class UnitOfLength    {        public static UnitOfLength Kilometers = new UnitOfLength(1.609344);        public static UnitOfLength NauticalMiles = new UnitOfLength(0.8684);        public static UnitOfLength Miles = new UnitOfLength(1);        private readonly double _fromMilesFactor;        private UnitOfLength(double fromMilesFactor)        {            _fromMilesFactor = fromMilesFactor;        }        public double ConvertFromMiles(double input)        {            return input * _fromMilesFactor;        }    }    public class Location : BaseObject, IEnclosedEntity    {        [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public double Longitude { get; set; }        [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public double Latitude { get; set; }        [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public DateTime Timestamp { get; set; }        [TextBoxEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public string Address { get; set; }        public double DistanceTo(Location location, UnitOfLength unitOfLength)        {            var baseRad = Math.PI * Latitude / 180;            var targetRad = Math.PI * location.Latitude / 180;            var theta = Longitude - location.Longitude;            var thetaRad = Math.PI * theta / 180;            var dist =                Math.Sin(baseRad) * Math.Sin(targetRad) + Math.Cos(baseRad) *                Math.Cos(targetRad) * Math.Cos(thetaRad);            dist = Math.Acos(dist);            dist = dist * 180 / Math.PI;            dist = dist * 60 * 1.1515;            return unitOfLength.ConvertFromMiles(dist);        }    }}
 |