Sphere.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. namespace Masuit.Tools.Models;
  3. /// <summary>
  4. /// 球体
  5. /// </summary>
  6. public class Sphere
  7. {
  8. /// <summary>
  9. /// 地球
  10. /// </summary>
  11. public static Sphere Earth => new(6371.393);
  12. public Sphere(double radius)
  13. {
  14. Radius = radius;
  15. }
  16. /// <summary>
  17. /// 半径
  18. /// </summary>
  19. public double Radius { get; }
  20. /// <summary>
  21. /// 角度转弧度
  22. /// </summary>
  23. /// <param name="d">角度</param>
  24. /// <returns></returns>
  25. private static double Angle2Radian(double d)
  26. {
  27. return d / 180.0 * Math.PI;
  28. }
  29. /// <summary>
  30. /// 计算球体上两点的弧长
  31. /// </summary>
  32. /// <param name="lat1"></param>
  33. /// <param name="lng1"></param>
  34. /// <param name="lat2"></param>
  35. /// <param name="lng2"></param>
  36. /// <returns></returns>
  37. public double GetDistance(double lat1, double lng1, double lat2, double lng2)
  38. {
  39. var rad1 = Angle2Radian(lat1);
  40. var rad2 = Angle2Radian(lat2);
  41. 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;
  42. }
  43. /// <summary>
  44. /// 是否相交
  45. /// </summary>
  46. /// <param name="circle1"></param>
  47. /// <param name="circle2"></param>
  48. /// <returns></returns>
  49. public bool IsCrossWith(Circle circle1, Circle circle2)
  50. {
  51. var dis = GetDistance(circle1.Center.X, circle1.Center.Y, circle2.Center.X, circle2.Center.Y);
  52. return circle1.Radius - circle2.Radius < dis && dis < circle1.Radius + circle2.Radius;
  53. }
  54. /// <summary>
  55. /// 是否相切
  56. /// </summary>
  57. /// <param name="circle1"></param>
  58. /// <param name="circle2"></param>
  59. /// <returns></returns>
  60. public bool IsIntersectWith(Circle circle1, Circle circle2)
  61. {
  62. var dis = GetDistance(circle1.Center.X, circle1.Center.Y, circle2.Center.X, circle2.Center.Y);
  63. return Math.Abs(circle1.Radius - circle2.Radius - dis) < 1e-7 || Math.Abs(dis - (circle1.Radius + circle2.Radius)) < 1e-7;
  64. }
  65. /// <summary>
  66. /// 是否相离
  67. /// </summary>
  68. /// <param name="circle1"></param>
  69. /// <param name="circle2"></param>
  70. /// <returns></returns>
  71. public bool IsSeparateWith(Circle circle1, Circle circle2)
  72. {
  73. return !IsCrossWith(circle1, circle2) && !IsIntersectWith(circle1, circle2);
  74. }
  75. }