Sphere.cs 2.7 KB

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