qxLib
rect.h
Go to the documentation of this file.
1 /**
2 
3  @file rect.h
4  @author Khrapov
5  @date 12.11.2021
6  @copyright © Nick Khrapov, 2021. All right reserved.
7 
8 **/
9 #pragma once
10 
11 #include <algorithm>
12 #include <optional>
13 
15 #include <qx/math/common.h>
16 
17 QX_PUSH_SUPPRESS_ALL_WARNINGS();
18 #include <glm/vec2.hpp>
19 QX_POP_SUPPRESS_WARNINGS();
20 
21 namespace qx
22 {
23 
24 /**
25 
26  @class rect
27  @brief Rectangle class
28  @author Khrapov
29  @date 12.11.2021
30 
31 **/
32 template<class vector_t>
34 {
35 public:
36  using vector_type = vector_t;
37  using value_type = typename vector_type::value_type;
38 
39 public:
40  QX_COPYMOVABLE(basic_rect);
41 
42  constexpr basic_rect() noexcept = default;
43 
44  /**
45  @brief basic_rect object constructor
46  @param size - rect size
47  @param pos - upper left corner pos
48  **/
49  constexpr explicit basic_rect(vector_t size, vector_t pos = vector_t(value_type(0.f))) noexcept;
50 
51  /**
52  @brief basic_rect object constructor
53  @param width - rect width
54  @param height - rect height
55  @param xPos - rect upper left corner x pos
56  @param yPos - rect upper left corner y pos
57  **/
58  constexpr basic_rect(
59  value_type width,
60  value_type height,
61  value_type xPos = value_type(0.f),
62  value_type yPos = value_type(0.f)) noexcept;
63 
64  /**
65  @brief Expand rect
66  @param dSize - size to expand
67  **/
68  constexpr void expand(const vector_t& dSize) noexcept;
69 
70  /**
71  @brief Contract rect
72  @param dSize - size to contract
73  **/
74  constexpr void contract(const vector_t& dSize) noexcept;
75 
76  /**
77  @brief Change rect size
78  @param size - new size
79  **/
80  constexpr void set_size(const vector_t& size) noexcept;
81 
82  /**
83  @brief Set rect position
84  @param pos - rect position
85  **/
86  constexpr void set_pos(const vector_t& pos) noexcept;
87 
88  /**
89  @brief Shift rect position
90  @param dPos - position delta
91  **/
92  constexpr void shift(const vector_t& dPos) noexcept;
93 
94  /**
95  @brief Get upper left corner pos
96  @retval - upper left corner pos
97  **/
98  constexpr const vector_t& pos() const noexcept;
99 
100  /**
101  @brief Get min rect pos
102  @details same as pos()
103  @retval - min rect pos
104  **/
105  constexpr const vector_t& min() const noexcept;
106 
107  /**
108  @brief Get max rect pos
109  @retval - max rect pos
110  **/
111  constexpr vector_t max() const noexcept;
112 
113  /**
114  @brief Get rect size
115  @retval - rect size
116  **/
117  constexpr const vector_t& size() const noexcept;
118 
119  /**
120  @brief Get rect width
121  @retval - rect width
122  **/
123  constexpr value_type width() const noexcept;
124 
125  /**
126  @brief Get rect height
127  @retval - rect height
128  **/
129  constexpr value_type height() const noexcept;
130 
131  /**
132  @brief Get rect left border coordinate (x)
133  @retval - rect left border coordinate (x)
134  **/
135  constexpr value_type left() const noexcept;
136 
137  /**
138  @brief rect right border coordinate (x)
139  @retval - rect right border coordinate (x)
140  **/
141  constexpr value_type right() const noexcept;
142 
143  /**
144  @brief rect top border coordinate (y)
145  @retval - rect top border coordinate (y)
146  **/
147  constexpr value_type top() const noexcept;
148 
149  /**
150  @brief rect bottom border coordinate (y)
151  @retval - rect bottom border coordinate (y)
152  **/
153  constexpr value_type bottom() const noexcept;
154 
155  /**
156  @brief Get rect center pos
157  @retval - rect center pos
158  **/
159  constexpr vector_t center() const noexcept;
160 
161  /**
162  @brief Is rect empty
163  @retval - true if rect is empty
164  **/
165  constexpr bool empty() const noexcept;
166 
167  /**
168  @brief Calc rect area
169  @retval - rect area
170  **/
171  constexpr value_type area() const noexcept;
172 
173  /**
174  @brief Is point inside rect
175  @param pos - point pos
176  @param originPos - coordinate system center pos
177  @retval - true if pos is inside rect
178  **/
179  constexpr bool contains(const vector_t& pos, const vector_t& originPos = vector_t(0.f)) const noexcept;
180 
181  /**
182  @brief Is other rect inside this rect
183  @param other - other rect
184  @param originPos - coordinate system center pos
185  @retval - true if other rect is inside this rect
186  **/
187  constexpr bool contains(const basic_rect& other, const vector_t& originPos = vector_t(0.f)) const noexcept;
188 
189  /**
190  @brief Is this rect overlaps other rect
191  @param other - other rect
192  @retval - true if this rect is overlaps other rect
193  **/
194  constexpr bool overlaps(const basic_rect& other) const noexcept;
195 
196  /**
197  @brief Get rect representing overlap this rect by other rect
198  @param other - other rect
199  @retval - rect representing overlap this rect by other rect or nullopt
200  **/
201  constexpr std::optional<basic_rect> overlap(const basic_rect& other) const noexcept;
202 
203  constexpr bool operator==(const basic_rect& other) const noexcept;
204  constexpr bool operator!=(const basic_rect& other) const noexcept;
205 
206 private:
207  /**
208  @brief Check new size and assign if size is positive
209  @param size - new size
210  **/
211  constexpr void check_and_assign_size(const vector_t& size) noexcept;
212 
213 private:
214  vector_t m_Size = vector_t(0.f);
215  vector_t m_Pos = vector_t(0.f);
216 };
217 
220 
221 } // namespace qx
222 
223 #include <qx/render/rect.inl>
constexpr void shift(const vector_t &dPos) noexcept
Shift rect position.
Definition: rect.inl:55
constexpr value_type width() const noexcept
Get rect width.
Definition: rect.inl:85
constexpr vector_t center() const noexcept
Get rect center pos.
Definition: rect.inl:121
constexpr value_type height() const noexcept
Get rect height.
Definition: rect.inl:91
constexpr void set_pos(const vector_t &pos) noexcept
Set rect position.
Definition: rect.inl:49
constexpr value_type bottom() const noexcept
rect bottom border coordinate (y)
Definition: rect.inl:115
constexpr value_type top() const noexcept
rect top border coordinate (y)
Definition: rect.inl:109
constexpr bool empty() const noexcept
Is rect empty.
Definition: rect.inl:127
constexpr void contract(const vector_t &dSize) noexcept
Contract rect.
Definition: rect.inl:37
constexpr const vector_t & min() const noexcept
Get min rect pos.
Definition: rect.inl:67
constexpr std::optional< basic_rect > overlap(const basic_rect &other) const noexcept
Get rect representing overlap this rect by other rect.
Definition: rect.inl:161
constexpr value_type area() const noexcept
Calc rect area.
Definition: rect.inl:133
constexpr value_type right() const noexcept
rect right border coordinate (x)
Definition: rect.inl:103
constexpr value_type left() const noexcept
Get rect left border coordinate (x)
Definition: rect.inl:97
constexpr void set_size(const vector_t &size) noexcept
Change rect size.
Definition: rect.inl:43
constexpr bool overlaps(const basic_rect &other) const noexcept
Is this rect overlaps other rect.
Definition: rect.inl:154
constexpr const vector_t & pos() const noexcept
Get upper left corner pos.
Definition: rect.inl:61
constexpr vector_t max() const noexcept
Get max rect pos.
Definition: rect.inl:73
constexpr const vector_t & size() const noexcept
Get rect size.
Definition: rect.inl:79
constexpr bool contains(const vector_t &pos, const vector_t &originPos=vector_t(0.f)) const noexcept
Is point inside rect.
Definition: rect.inl:139
constexpr void expand(const vector_t &dSize) noexcept
Expand rect.
Definition: rect.inl:31