Circle.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Masuit.Tools.Maths;
  2. using System;
  3. namespace Masuit.Tools.Models;
  4. /// <summary>
  5. /// 圆形
  6. /// </summary>
  7. public class Circle
  8. {
  9. /// <summary>
  10. /// 圆形
  11. /// </summary>
  12. /// <param name="center">圆心坐标</param>
  13. /// <param name="radius">半径</param>
  14. public Circle(Point2D center, double radius)
  15. {
  16. Center = center;
  17. Radius = radius;
  18. if (radius < 0)
  19. {
  20. throw new ArgumentException("半径不能为负数", nameof(radius));
  21. }
  22. }
  23. /// <summary>
  24. /// 圆心坐标
  25. /// </summary>
  26. public Point2D Center { get; }
  27. /// <summary>
  28. /// 半径
  29. /// </summary>
  30. public double Radius { get; }
  31. /// <summary>
  32. /// 是否相交
  33. /// </summary>
  34. /// <param name="that"></param>
  35. /// <returns></returns>
  36. public bool IsCrossWith(Circle that)
  37. {
  38. var dis = Math.Sqrt(Math.Pow(that.Center.X - Center.X, 2) + Math.Pow(that.Center.Y - Center.Y, 2));
  39. return that.Radius - Radius < dis && dis < that.Radius + Radius;
  40. }
  41. /// <summary>
  42. /// 是否相切
  43. /// </summary>
  44. /// <param name="that"></param>
  45. /// <returns></returns>
  46. public bool IsIntersectWith(Circle that)
  47. {
  48. var dis = Math.Sqrt(Math.Pow(that.Center.X - Center.X, 2) + Math.Pow(that.Center.Y - Center.Y, 2));
  49. return Math.Abs(that.Radius - Radius - dis) < 1e-7 || Math.Abs(dis - (that.Radius + Radius)) < 1e-7;
  50. }
  51. /// <summary>
  52. /// 是否相离
  53. /// </summary>
  54. /// <param name="that"></param>
  55. /// <returns></returns>
  56. public bool IsSeparateWith(Circle that)
  57. {
  58. return !IsCrossWith(that) && !IsIntersectWith(that);
  59. }
  60. }