using System; namespace Masuit.Tools.Models; /// /// 球体 /// public class Sphere { /// /// 地球 /// public static Sphere Earth => new(6371.393); public Sphere(double radius) { Radius = radius; } /// /// 半径 /// public double Radius { get; } /// /// 角度转弧度 /// /// 角度 /// private static double Angle2Radian(double d) { return d / 180.0 * Math.PI; } /// /// 计算球体上两点的弧长 /// /// /// /// /// /// public double GetDistance(double lat1, double lng1, double lat2, double lng2) { var rad1 = Angle2Radian(lat1); var rad2 = Angle2Radian(lat2); return 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin((rad1 - rad2) / 2), 2) + Math.Cos(rad1) * Math.Cos(rad2) * Math.Pow(Math.Sin((Angle2Radian(lng1) - Angle2Radian(lng2)) / 2), 2))) * Radius; } /// /// 是否相交 /// /// /// /// public bool IsCrossWith(Circle circle1, Circle circle2) { var dis = GetDistance(circle1.Center.X, circle1.Center.Y, circle2.Center.X, circle2.Center.Y); return circle1.Radius - circle2.Radius < dis && dis < circle1.Radius + circle2.Radius; } /// /// 是否相切 /// /// /// /// public bool IsIntersectWith(Circle circle1, Circle circle2) { var dis = GetDistance(circle1.Center.X, circle1.Center.Y, circle2.Center.X, circle2.Center.Y); return Math.Abs(circle1.Radius - circle2.Radius - dis) < 1e-7 || Math.Abs(dis - (circle1.Radius + circle2.Radius)) < 1e-7; } /// /// 是否相离 /// /// /// /// public bool IsSeparateWith(Circle circle1, Circle circle2) { return !IsCrossWith(circle1, circle2) && !IsIntersectWith(circle1, circle2); } }