circle2.nim 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # author: Ethosa
  2. ## Provides Circle2 type.
  3. import
  4. vector2
  5. {.used.}
  6. type
  7. Circle2Obj* = object
  8. x*, y*, r*: float
  9. Circle2Ref* = ref Circle2Obj
  10. proc Circle2*(x, y, r: float): Circle2Ref =
  11. ## Creates a new Circle2 object.
  12. ##
  13. ## Arguments:
  14. ## - `x` is a center circle point at X axis.
  15. ## - `y` is a center circle point at Y axis.
  16. ## - `r` is a circle radius.
  17. runnableExamples:
  18. var circle = Circle2(10, 10, 5)
  19. Circle2Ref(x: x, y: y, r: r)
  20. proc Circle2*(vec: Vector2Ref, r: float): Circle2Ref =
  21. ## Creates a new Circle2 object.
  22. ##
  23. ## Arguments:
  24. ## - `vec` is a circle center position.
  25. ## - `r` is a circle radius.
  26. Circle2Ref(x: vec.x, y: vec.y, r: r)
  27. proc contains*(self: Circle2Ref, x, y: float): bool =
  28. ## Returns true, if `x`,`y` in the circle.
  29. let
  30. dx = x - self.x
  31. dy = y - self.y
  32. dx*dx + dy*dy <= self.r*self.r
  33. proc contains*(self: Circle2Ref, vec2: Vector2Ref): bool {.inline.} =
  34. ## Returns true, if `vec2` in the circle.
  35. self.contains(vec2.x, vec2.y)
  36. proc contains*(self, other: Circle2Ref): bool =
  37. ## Returns true, if `self` intersects with `other` circle.
  38. let
  39. dx = other.x - self.x
  40. dy = other.y - self.y
  41. r = other.r + self.r
  42. dx*dx + dy*dy <= r*r
  43. # --- Operators --- #
  44. proc `$`*(self: Circle2Ref): string =
  45. "Circle2(x:" & $self.x & ", y:" & $self.y & ", r:" & $self.r & ")"