Circle.cs 1.9 KB

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