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);
}
}