Face Engine SDK  5.21.0
A face detection, recognition and tracking engine.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Rect.h
1 #pragma once
2 
3 #include <fsdk/Types/Vector2.h>
4 
5 namespace fsdk {
8  template <typename Type>
9  struct BaseRect {
10  typedef Type ElementType;
11 
12  Type x;
13  Type y;
14  Type width;
15  Type height;
16 
19  BaseRect() noexcept
20  : x(0)
21  , y(0)
22  , width(0)
23  , height(0) {
24  }
25 
32  BaseRect(Type x_, Type y_, Type w_, Type h_) noexcept
33  : x(x_)
34  , y(y_)
35  , width(w_)
36  , height(h_) {
37  }
38 
45  }
46 
50  BaseRect(const BaseRect& other) noexcept {
51  *this = other;
52  }
53 
54  template <typename OtherType>
55  BaseRect(const BaseRect<OtherType>& other) noexcept {
56  *this = other;
57  }
58 
61  void setLeft(Type l) noexcept {
62  const auto r = right();
63  x = l;
64  setRight(r);
65  }
66 
69  void setTop(Type t) noexcept {
70  const auto b = bottom();
71  y = t;
72  setBottom(b);
73  }
74 
77  void setRight(Type r) noexcept {
78  width = r - x;
79  }
80 
83  void setBottom(Type b) noexcept {
84  height = b - y;
85  }
86 
93  static BaseRect coords(Type x0, Type y0, Type x1, Type y1) noexcept {
94  return BaseRect(x0, y0, x1 - x0, y1 - y0);
95  }
96 
102  static float intersectionOverFirstRect(const BaseRect& rect1, const BaseRect& rect2) {
103  const float inter = (rect1 & rect2).getArea();
104  return inter / rect1.getArea();
105  }
106 
112  static float intersectionOverUnion(const BaseRect& rect1, const BaseRect& rect2) {
113  const float inter = (rect1 & rect2).getArea();
114  return inter / (rect1.getArea() + rect2.getArea() - inter);
115  }
116 
122  static float intersectionOverForeground(const BaseRect& rect1, const BaseRect& rect2) {
123  if(rect1.getArea() < rect2.getArea()) {
124  return intersectionOverFirstRect(rect1, rect2);
125  }
126  return intersectionOverFirstRect(rect2, rect1);
127  }
128 
133  template <typename OtherType>
134  BaseRect& operator=(const BaseRect<OtherType>& other) noexcept {
135  if(reinterpret_cast<const void*>(this) != reinterpret_cast<const void*>(&other)) {
136  x = static_cast<Type>(other.x);
137  y = static_cast<Type>(other.y);
138  width = static_cast<Type>(other.width);
139  height = static_cast<Type>(other.height);
140  }
141  return *this;
142  }
143 
148  template <typename OtherType>
149  bool operator==(const BaseRect<OtherType>& other) const noexcept {
150  return x == other.x && y == other.y && width == other.width && height == other.height;
151  }
152 
157  template <typename OtherType>
158  bool operator!=(const BaseRect<OtherType>& other) const noexcept {
159  return !(*this == other);
160  }
161 
166  BaseRect operator&(const BaseRect& other) const noexcept {
167  BaseRect newRect;
168  newRect.x = x > other.x ? x : other.x;
169  newRect.y = y > other.y ? y : other.y;
170  newRect.width = (x + width < other.x + other.width ? x + width : other.x + other.width) - newRect.x;
171  newRect.height =
172  (y + height < other.y + other.height ? y + height : other.y + other.height) - newRect.y;
173  if(newRect.width <= 0 || newRect.height <= 0)
174  newRect = BaseRect();
175  return newRect;
176  }
177 
182  BaseRect operator&=(const BaseRect& other) noexcept {
183  if(this != &other)
184  *this = *this & other;
185 
186  return *this;
187  }
188 
193  BaseRect operator|(const BaseRect& other) const noexcept {
194  BaseRect newRect;
195  newRect.x = x < other.x ? x : other.x;
196  newRect.y = y < other.y ? y : other.y;
197  newRect.width = (x + width > other.x + other.width ? x + width : other.x + other.width) - newRect.x;
198  newRect.height =
199  (y + height > other.y + other.height ? y + height : other.y + other.height) - newRect.y;
200 
201  return newRect;
202  }
203 
208  BaseRect operator|=(const BaseRect& other) noexcept {
209  if(this != &other)
210  *this = *this & other;
211 
212  return *this;
213  }
214 
219  BaseRect operator*(float scaleFactor) const noexcept {
220  BaseRect newRect;
221  newRect.x = static_cast<Type>(x * scaleFactor);
222  newRect.y = static_cast<Type>(y * scaleFactor);
223  newRect.width = static_cast<Type>(width * scaleFactor);
224  newRect.height = static_cast<Type>(height * scaleFactor);
225 
226  return newRect;
227  }
228 
233  BaseRect operator/(float scaleFactor) const noexcept {
234  BaseRect newRect;
235  newRect.x = static_cast<Type>(x / scaleFactor);
236  newRect.y = static_cast<Type>(y / scaleFactor);
237  newRect.width = static_cast<Type>(width / scaleFactor);
238  newRect.height = static_cast<Type>(height / scaleFactor);
239 
240  return newRect;
241  }
242 
244  BaseRect newRect = *this;
245  newRect.x += vec.x;
246  newRect.y += vec.y;
247 
248  return newRect;
249  }
250 
251  BaseRect operator-(Vector2<typename BaseRect::ElementType> vec) {
252  BaseRect newRect = *this;
253  newRect.x -= vec.x;
254  newRect.y -= vec.y;
255 
256  return newRect;
257  }
258 
262  Vector2<Type> size() const noexcept {
263  return Vector2<Type>(width, height);
264  }
265 
269  Vector2<Type> topLeft() const noexcept {
270  return Vector2<Type>(x, y);
271  }
272 
276  Vector2<Type> center() const noexcept {
277  return Vector2<Type>(x + width / 2, y + height / 2);
278  }
279 
283  Vector2<Type> bottomRight() const noexcept {
284  return Vector2<Type>(x + width, y + height);
285  }
286 
290  Type top() const noexcept {
291  return y;
292  }
293 
297  Type bottom() const noexcept {
298  return y + height;
299  }
300 
304  Type left() const noexcept {
305  return x;
306  }
307 
311  Type right() const noexcept {
312  return x + width;
313  }
314 
319  void set(const Vector2<Type>& topLeft, const Vector2<Type>& bottomRight) noexcept {
320  x = topLeft.x;
321  y = topLeft.y;
322  width = bottomRight.x - x;
323  height = bottomRight.y - y;
324  }
325 
332  void adjust(Type dx, Type dy, Type dw, Type dh) noexcept {
333  x += dx;
334  y += dy;
335  width += dw;
336  height += dh;
337  }
338 
346  BaseRect adjusted(Type dx, Type dy, Type dw, Type dh) const noexcept {
347  BaseRect rect(*this);
348  rect.adjust(dx, dy, dw, dh);
349  return rect;
350  }
351 
355  Type getArea() const noexcept {
356  return width * height;
357  }
358 
363  bool inside(const BaseRect& other) const noexcept {
364  return topLeft() >= other.topLeft() && bottomRight() <= other.bottomRight();
365  }
366 
372  bool isValid() const noexcept {
373  return width > 0 && height > 0;
374  }
375  };
376 
382  template <typename Type>
383  BaseRect<Type> centerScale(const BaseRect<Type>& in, float scaleFactor) noexcept {
384  BaseRect<Type> out;
385  out.x = in.x - 0.5 * (scaleFactor - 1) * in.width;
386  out.y = in.y - 0.5 * (scaleFactor - 1) * in.height;
387  out.width = in.width * scaleFactor;
388  out.height = in.height * scaleFactor;
389  return out;
390  }
391 
392  using Rect = BaseRect<int>;
393  using FloatRect = BaseRect<float>;
394 } // namespace fsdk
void setBottom(Type b) noexcept
Set rect bottom.
Definition: Rect.h:83
Type height
Rectangle height.
Definition: Rect.h:15
BaseRect() noexcept
Initializes a default invalid rectangle.
Definition: Rect.h:19
Vector2< Type > size() const noexcept
Gets rect size (width, height).
Definition: Rect.h:262
bool inside(const BaseRect &other) const noexcept
Checks whether this rect is inside of another rect.
Definition: Rect.h:363
static BaseRect coords(Type x0, Type y0, Type x1, Type y1) noexcept
Create new Rect by coordinates.
Definition: Rect.h:93
static float intersectionOverForeground(const BaseRect &rect1, const BaseRect &rect2)
Calculates rects intersection rate over foreground.
Definition: Rect.h:122
Vector2< Type > center() const noexcept
Gets rect center coordinates.
Definition: Rect.h:276
Type left() const noexcept
Gets rect left x coordinate.
Definition: Rect.h:304
BaseRect & operator=(const BaseRect< OtherType > &other) noexcept
Copies another rect.
Definition: Rect.h:134
Type width
Rectangle width.
Definition: Rect.h:14
Type getArea() const noexcept
Computes rect area (width x height).
Definition: Rect.h:355
void setLeft(Type l) noexcept
Set rect left.
Definition: Rect.h:61
T x
x coordinate.
Definition: Vector2.h:11
BaseRect(Type x_, Type y_, Type w_, Type h_) noexcept
Initializes a rectangle with given values.
Definition: Rect.h:32
bool isValid() const noexcept
Checks whether a rect is valid.
Definition: Rect.h:372
void adjust(Type dx, Type dy, Type dw, Type dh) noexcept
Adjusts the rect by given amounts.
Definition: Rect.h:332
BaseRect operator|=(const BaseRect &other) noexcept
Returns minimum area rectangle containing both rects.
Definition: Rect.h:208
BaseRect(const BaseRect &other) noexcept
Copies another rect.
Definition: Rect.h:50
BaseRect operator*(float scaleFactor) const noexcept
Multiplicates Rect scale by specified scale factor.
Definition: Rect.h:219
BaseRect(const Vector2< Type > &topLeft, const Vector2< Type > &bottomRight) noexcept
Initializes a rectangle with given values.
Definition: Rect.h:43
Vector2< Type > topLeft() const noexcept
Gets rect top-left corner coordinates.
Definition: Rect.h:269
bool operator!=(const BaseRect< OtherType > &other) const noexcept
Checks whether two rects are not equal.
Definition: Rect.h:158
Type bottom() const noexcept
Gets rect bottom y coordinate.
Definition: Rect.h:297
static float intersectionOverFirstRect(const BaseRect &rect1, const BaseRect &rect2)
Calculates rects intersection rate over first rect.
Definition: Rect.h:102
BaseRect operator|(const BaseRect &other) const noexcept
Returns minimum area rectangle containing both rects.
Definition: Rect.h:193
void setRight(Type r) noexcept
Set rect right.
Definition: Rect.h:77
bool operator==(const BaseRect< OtherType > &other) const noexcept
Checks whether two rects are equal.
Definition: Rect.h:149
void setTop(Type t) noexcept
Set rect top.
Definition: Rect.h:69
static float intersectionOverUnion(const BaseRect &rect1, const BaseRect &rect2)
Calculates rects intersection rate over union.
Definition: Rect.h:112
BaseRect< Type > centerScale(const BaseRect< Type > &in, float scaleFactor) noexcept
scale rect out of center
Definition: Rect.h:383
BaseRect operator/(float scaleFactor) const noexcept
Divides Rect scale by specified scale factor.
Definition: Rect.h:233
BaseRect adjusted(Type dx, Type dy, Type dw, Type dh) const noexcept
Copies and adjusts the rect by given amounts.
Definition: Rect.h:346
Vector2< Type > bottomRight() const noexcept
Gets rect bottom-right corner coordinates.
Definition: Rect.h:283
BaseRect operator&=(const BaseRect &other) noexcept
Returns rect that is intersection of rects.
Definition: Rect.h:182
BaseRect operator&(const BaseRect &other) const noexcept
Returns rect that is intersection of rects.
Definition: Rect.h:166
Rectangle.
Definition: Rect.h:9
Type top() const noexcept
Gets rect top y coordinate.
Definition: Rect.h:290
T y
y coordinate.
Definition: Vector2.h:12
void set(const Vector2< Type > &topLeft, const Vector2< Type > &bottomRight) noexcept
Sets rect corner coordinates.
Definition: Rect.h:319
Type right() const noexcept
Gets rect right x coordinate.
Definition: Rect.h:311
Type y
Upper left corner y-coordinate.
Definition: Rect.h:13
Generic 2D vector.
Definition: Vector2.h:10
Type x
Upper left corner x-coordinate.
Definition: Rect.h:12