Empirical
Circle2D.h
Go to the documentation of this file.
1 // This file is part of Empirical, https://github.com/devosoft/Empirical
2 // Copyright (C) Michigan State University, 2016-2017.
3 // Released under the MIT Software license; see doc/LICENSE
4 //
5 // A class to manage circles in a 2D plane.
6 
7 
8 #ifndef EMP_CIRCLE_2D_H
9 #define EMP_CIRCLE_2D_H
10 
11 
12 #include "Point2D.h"
13 
14 namespace emp {
15 
16  template <typename TYPE=double> class Circle2D {
17  private:
18  Point2D<TYPE> center;
19  TYPE radius;
20 
21  public:
22  constexpr Circle2D(const Point2D<TYPE> & _c, TYPE _r=0) : center(_c), radius(_r) { ; }
23  constexpr Circle2D(TYPE _x, TYPE _y, TYPE _r=0) : center(_x,_y), radius(_r) { ; }
24  constexpr Circle2D(TYPE _r=0) : center(0.0, 0.0), radius(_r) { ; }
25 
26  constexpr const Point2D<TYPE> & GetCenter() const { return center; }
27  constexpr TYPE GetCenterX() const { return center.GetX(); }
28  constexpr TYPE GetCenterY() const { return center.GetY(); }
29  constexpr TYPE GetRadius() const { return radius; }
30  constexpr TYPE GetSquareRadius() const { return radius * radius; }
31 
32  Circle2D<TYPE> & SetCenter(const Point2D<TYPE> & c) { center = c; return *this; }
33  Circle2D<TYPE> & SetCenter(TYPE x, TYPE y) { center.Set(x,y); return *this; }
34  Circle2D<TYPE> & SetCenterX(TYPE x) { center.SetX(x); return *this; }
35  Circle2D<TYPE> & SetCenterY(TYPE y) { center.SetY(y); return *this; }
36  Circle2D<TYPE> & SetRadius(TYPE new_radius) { radius = new_radius; return *this; }
37  Circle2D<TYPE> & Set(const Point2D<TYPE> & c, TYPE r) { center = c; radius = r; return *this; }
38  Circle2D<TYPE> & Set(TYPE x, TYPE y, TYPE r) { center.Set(x,y); radius = r; return *this; }
39 
40  Circle2D<TYPE> & Translate(Point2D<TYPE> shift) { center += shift; return *this; }
41 
42  constexpr bool Contains(const Point2D<TYPE> & point) const {
43  return center.SquareDistance(point) < GetSquareRadius();
44  }
45  constexpr bool Contains(TYPE x, TYPE y) const {
46  return center.SquareDistance(Point2D<TYPE>(x,y)) < GetSquareRadius();
47  }
48  constexpr bool Contains(const Circle2D<TYPE> & other) const {
49  return (other.center.Distance(center) + other.GetRadius()) < GetRadius();
50  }
51  bool HasOverlap(const Circle2D<TYPE> & other) const {
52  const TYPE min_dist = radius + other.radius;
53  return center.SquareDistance(other.center) < (min_dist * min_dist);
54  }
55  };
56 
58 }
59 
60 #endif
constexpr bool Contains(const Circle2D< TYPE > &other) const
Definition: Circle2D.h:48
Circle2D< TYPE > & Set(TYPE x, TYPE y, TYPE r)
Definition: Circle2D.h:38
Circle2D< TYPE > & Translate(Point2D< TYPE > shift)
Definition: Circle2D.h:40
constexpr TYPE GetX() const
Definition: Point2D.h:39
constexpr bool Contains(TYPE x, TYPE y) const
Definition: Circle2D.h:45
constexpr TYPE GetSquareRadius() const
Definition: Circle2D.h:30
constexpr Circle2D(TYPE _r=0)
Definition: Circle2D.h:24
Circle2D< TYPE > & SetCenterX(TYPE x)
Definition: Circle2D.h:34
Definition: Circle2D.h:16
Circle2D< TYPE > & SetRadius(TYPE new_radius)
Definition: Circle2D.h:36
Point2D & Set(TYPE _x, TYPE _y)
Definition: Point2D.h:43
constexpr Circle2D(TYPE _x, TYPE _y, TYPE _r=0)
Definition: Circle2D.h:23
constexpr Circle2D(const Point2D< TYPE > &_c, TYPE _r=0)
Definition: Circle2D.h:22
TYPE SquareDistance(const Point2D &_in) const
Definition: Point2D.h:90
constexpr TYPE GetCenterX() const
Definition: Circle2D.h:27
Circle2D< TYPE > & SetCenter(const Point2D< TYPE > &c)
Definition: Circle2D.h:32
Circle2D< TYPE > & SetCenter(TYPE x, TYPE y)
Definition: Circle2D.h:33
Definition: Point2D.h:20
Circle2D< TYPE > & SetCenterY(TYPE y)
Definition: Circle2D.h:35
If we are in emscripten, make sure to include the header.
Definition: array.h:37
constexpr const Point2D< TYPE > & GetCenter() const
Definition: Circle2D.h:26
constexpr bool Contains(const Point2D< TYPE > &point) const
Definition: Circle2D.h:42
Point2D & SetY(TYPE in_y)
Definition: Point2D.h:42
Circle2D< TYPE > & Set(const Point2D< TYPE > &c, TYPE r)
Definition: Circle2D.h:37
constexpr TYPE GetY() const
Definition: Point2D.h:40
constexpr TYPE GetRadius() const
Definition: Circle2D.h:29
constexpr TYPE GetCenterY() const
Definition: Circle2D.h:28
bool HasOverlap(const Circle2D< TYPE > &other) const
Definition: Circle2D.h:51
Point2D & SetX(TYPE in_x)
Definition: Point2D.h:41