| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | using System;using System.Drawing;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 : EnclosedEntity    {        [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public double Longitude { get; set; }        [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public double Latitude { get; set; }        [DateTimeEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public DateTime Timestamp { get; set; }        [TextBoxEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]        public string Address { get; set; }        public static double DistanceBetween(PointF from, PointF to, UnitOfLength unitOfLength)        {            var baseRad = Math.PI * from.Y / 180;            var targetRad = Math.PI * to.Y / 180;            var theta = from.X - to.X;            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);        }                public double DistanceTo(Location location, UnitOfLength unitOfLength)        {            return DistanceBetween(                new PointF((float)Longitude, (float)Latitude),                 new PointF((float)location.Longitude, (float)location.Latitude),                unitOfLength            );        }        public void CopyFrom(Location location)        {            Longitude = location.Longitude;            Latitude = location.Latitude;            Timestamp = location.Timestamp;            Address = location.Address;        }    }}
 |