rect_lt.hpp
1 #pragma once
2 
3 #include <cmath>
4 
5 #include "global.hpp"
6 #include "size_2d.hpp"
7 #include "point_2d.hpp"
8 
9 
10 
11 namespace Cvb
12 {
13 
14 CVB_BEGIN_INLINE_NS
15 
17 
22 template< class T, class ENABLE = void>
23 class RectLT final
24 {
25 
26 #ifndef CVB_DOXYGEN
27  static_assert (IsNumeric<T>::value, "CVB: Unsupported data type - must be numeric!");
28 };
29 
30 
31 template <class T>
32 class RectLT<T,
33  typename EnableIfNumeric<T>::type> final
34 {
35 
36 #endif
37  public:
38 
40 
45  RectLT() noexcept
46  : left_(static_cast<T>(0))
47  , top_(static_cast<T>(0))
48  , right_(static_cast<T>(0))
49  , bottom_(static_cast<T>(0))
50  {};
51 
53 
60  RectLT(T left, T top, T right, T bottom) noexcept
61  {
62  SetLeft(left);
63  SetTop(top);
64  SetRight(right);
65  SetBottom(bottom);
66  }
67 
69 
74  RectLT(Point2D<T> location, Size2D<T> size) noexcept
75  {
76  SetLocation(location);
77  SetSize(size);
78  }
79 
81 
85  T Left() const noexcept
86  {
87  return left_;
88  }
89 
91 
95  void SetLeft(T left) noexcept
96  {
97  left_ = left;
98  }
99 
101 
105  T Top() const noexcept
106  {
107  return top_;
108  }
109 
111 
115  void SetTop(T top) noexcept
116  {
117  top_ = top;
118  }
119 
121 
125  T Right() const noexcept
126  {
127  return right_;
128  }
129 
131 
135  void SetRight(T right) noexcept
136  {
137  right_ = right;
138  }
139 
141 
145  T Bottom() const noexcept
146  {
147  return bottom_;
148  }
149 
151 
155  void SetBottom(T bottom) noexcept
156  {
157  bottom_ = bottom;
158  }
159 
161 
165  T Width() const noexcept
166  {
167  return right_ - left_;
168  }
169 
171 
175  void SetWidth(T width) noexcept
176  {
177  right_ = left_ + width;
178  }
179 
181 
185  T Height() const noexcept
186  {
187  return bottom_ - top_;
188  }
189 
191 
195  void SetHeight(T height) noexcept
196  {
197  bottom_ = top_ + height;
198  }
199 
201 
205  Size2D<T> Size() const noexcept
206  {
207  return Size2D<T>(Width(), Height());
208  }
209 
211 
215  void SetSize(Size2D<T> size) noexcept
216  {
217  SetWidth(size.Width());
218  SetHeight(size.Height());
219  }
220 
222 
226  Point2D<T> Location() const noexcept
227  {
228  return Point2D<T>(left_, top_);
229  }
230 
232 
236  void SetLocation(Point2D<T> location) noexcept
237  {
238  right_ = location.X() + Width();
239  bottom_ = location.Y() + Height();
240  left_ = location.X();
241  top_ = location.Y();
242  }
243 
244 
246 
250  bool IsValid() const noexcept
251  {
252  return Width() > static_cast<T>(0.0)
253  && Height() > static_cast<T>(0.0);
254  }
255 
256 
258 
263  bool Contains(Point2D<T> point) const noexcept
264  {
265  return (point.X() >= Left()) && (point.Y() >= Top()) && (point.X() <= Right()) && (point.Y() <= Bottom());
266  }
267 
268 
270 
275  {
277  }
278 
280 
285  bool operator==(const RectLT<T>& rect) const noexcept
286  {
287  return (top_ == rect.top_
288  && left_ == rect.left_
289  && bottom_ == rect.bottom_
290  && right_ == rect.right_);
291  }
292 
293 
295 
300  bool operator!=(const RectLT<T>& rect) const noexcept
301  {
302  return !(*this == rect);
303  }
304 
306  template<class C>
307  explicit operator RectLT<C>() const noexcept
308  {
309  return RectLT<C>(
310  static_cast<C>(Left()),
311  static_cast<C>(Top()),
312  static_cast<C>(Right()),
313  static_cast<C>(Bottom())
314  );
315  }
316 
317  private:
318 
319  T left_;
320  T top_;
321  T right_;
322  T bottom_;
323 };
324 
325 
327 
334 template <class T>
335 inline RectLT<int> Round(const RectLT<T> & rhs) noexcept
336 {
337  static_assert(IsNumeric<T>::value, "CVB: Unsupported data type - must be numeric!");
338  return RectLT<int>(static_cast<int>(std::round(rhs.Left())),
339  static_cast<int>(std::round(rhs.Top())),
340  static_cast<int>(std::round(rhs.Right())),
341  static_cast<int>(std::round(rhs.Bottom())));
342 }
343 
344 CVB_END_INLINE_NS
345 
346 }
T Height() const noexcept
Gets the vertical component of the size.
Definition: size_2d.hpp:79
Rectangle object.
Definition: rect_lt.hpp:23
bool Contains(Point2D< T > point) const noexcept
Checks if this rectangle contains a point.
Definition: rect_lt.hpp:263
void SetHeight(T height) noexcept
Sets the height of the rectangle.
Definition: rect_lt.hpp:195
RectLT(Point2D< T > location, Size2D< T > size) noexcept
Constructor for a rectangle.
Definition: rect_lt.hpp:74
Point2D< int > Round(const Point2D< T > &rhs) noexcept
Round to an integer point.
Definition: point_2d.hpp:380
void SetTop(T top) noexcept
Sets top of the rectangle.
Definition: rect_lt.hpp:115
void SetSize(Size2D< T > size) noexcept
Gets the size of the rectangle.
Definition: rect_lt.hpp:215
bool IsValid() const noexcept
Checks if the rectangle is valid.
Definition: rect_lt.hpp:250
Stores a pair of numbers that represents the width and the height of a subject, typically a rectangle...
Definition: size_2d.hpp:19
bool operator!=(const RectLT< T > &rect) const noexcept
Compares to another rectangle.
Definition: rect_lt.hpp:300
bool operator==(const RectLT< T > &rect) const noexcept
Compares to another rectangle.
Definition: rect_lt.hpp:285
void SetRight(T right) noexcept
Sets rightmost point of the rectangle.
Definition: rect_lt.hpp:135
T Top() const noexcept
Gets top of the rectangle.
Definition: rect_lt.hpp:105
Root namespace for the Image Manager interface.
Definition: version.hpp:11
Point2D< T > Location() const noexcept
Gets the location of the top left corner of the rectangle.
Definition: rect_lt.hpp:226
void SetLeft(T left) noexcept
Sets leftmost point of the rectangle.
Definition: rect_lt.hpp:95
CoordinateSystemType
Enumeration of the different available coordinate systems that an Area of interest may be defined in.
Definition: global.hpp:263
T Left() const noexcept
Gets the leftmost point of the rectangle.
Definition: rect_lt.hpp:85
Multi-purpose 2D vector class.
Definition: point_2d.hpp:19
T Right() const noexcept
Gets rightmost point of the rectangle.
Definition: rect_lt.hpp:125
T Width() const noexcept
Gets the width of the rectangle.
Definition: rect_lt.hpp:165
CoordinateSystemType CoordinateSystem() const noexcept
Indicates the coordinate system in which this object is being measured (when used as an area of inter...
Definition: rect_lt.hpp:274
void SetWidth(T width) noexcept
Sets the width of the rectangle.
Definition: rect_lt.hpp:175
void SetBottom(T bottom) noexcept
Sets bottom of the rectangle.
Definition: rect_lt.hpp:155
T Height() const noexcept
Gets the height of the rectangle.
Definition: rect_lt.hpp:185
T Bottom() const noexcept
Gets bottom of the rectangle.
Definition: rect_lt.hpp:145
Size2D< T > Size() const noexcept
Gets the size of the rectangle.
Definition: rect_lt.hpp:205
void SetLocation(Point2D< T > location) noexcept
Sets the location of the top left corner of the rectangle.
Definition: rect_lt.hpp:236
RectLT(T left, T top, T right, T bottom) noexcept
Constructor for a rectangle.
Definition: rect_lt.hpp:60
T Width() const noexcept
Gets the horizontal component of the size.
Definition: size_2d.hpp:59
RectLT() noexcept
Default rectangle.
Definition: rect_lt.hpp:45