using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace MyFriendsAround.WP7.Utils { /// /// The distance type to return the results in. /// public enum DistanceType { Miles, Kilometers }; /// /// Specifies a Latitude / Longitude point. /// public struct Position { public double Latitude; public double Longitude; } public class Haversine { /// /// Returns the distance in miles or kilometers of any two /// latitude / longitude points. /// /// /// /// /// public static double Distance(Position pos1, Position pos2, DistanceType type) { double R = (type == DistanceType.Miles) ? 3960 : 6371; double dLat = toRadian(pos2.Latitude - pos1.Latitude); double dLon = toRadian(pos2.Longitude - pos1.Longitude); double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(toRadian(pos1.Latitude)) * Math.Cos(toRadian(pos2.Latitude)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2); double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a))); double d = R * c; return d; } /// /// Convert to Radians. /// /// /// private static double toRadian(double val) { return (Math.PI / 180) * val; } } }