12#include "rectangle.hpp"
15namespace hi::inline
v1 {
24 constexpr quad() noexcept : p0(), p1(), p2(), p3() {}
28 constexpr quad(quad
const &)
noexcept =
default;
29 constexpr quad(quad &&) noexcept = default;
30 constexpr quad &operator=(quad const &) noexcept = default;
31 constexpr quad &operator=(quad &&) noexcept = default;
33 constexpr quad(aarectangle const &rhs) noexcept
35 hilet tmp = f32x4{rhs};
36 p0 = point3{tmp.xy01()};
37 p1 = point3{tmp.zy01()};
38 p2 = point3{tmp.xw01()};
39 p3 = point3{tmp.zw01()};
42 constexpr quad(rectangle
const &rhs) noexcept : p0(get<0>(rhs)), p1(get<1>(rhs)), p2(get<2>(rhs)), p3(get<3>(rhs)) {}
78 hilet[x, y, z, zeros] = transpose(f32x4{
bottom()}, f32x4{left()}, f32x4{
top()}, f32x4{right()});
79 return sqrt(x * x + y * y + z * z);
93 [[nodiscard]]
constexpr point3
const &operator[](
std::size_t index)
const noexcept
104 template<std::
size_t I>
105 [[nodiscard]]
constexpr friend point3
const &get(quad
const &rhs)
noexcept
107 static_assert(I < 4,
"Index out of range.");
109 if constexpr (I == 0) {
111 }
else if constexpr (I == 1) {
113 }
else if constexpr (I == 2) {
120 template<std::
size_t I>
121 [[nodiscard]]
constexpr friend point3 &get(quad &rhs)
noexcept
123 static_assert(I < 4,
"Index out of range.");
125 if constexpr (I == 0) {
127 }
else if constexpr (I == 1) {
129 }
else if constexpr (I == 2) {
146 hilet t = f32x4{lhs.top()};
147 hilet l = f32x4{lhs.left()};
148 hilet b = f32x4{lhs.bottom()};
149 hilet r = f32x4{lhs.right()};
151 hilet[x, y, z, ones] = transpose(t, l, b, r);
152 hilet square_lengths = x * x + y * y + z * z;
153 hilet inv_lengths = rcp_sqrt(square_lengths);
154 hilet norm_t = t * inv_lengths.xxxx();
155 hilet norm_l = l * inv_lengths.yyyy();
156 hilet norm_b = b * inv_lengths.zzzz();
157 hilet norm_r = r * inv_lengths.wwww();
159 hilet extra_width = rhs.xxxx();
160 hilet extra_height = rhs.yyyy();
167 hilet lengths = rcp(inv_lengths);
169 hilet rhs_times_2 = rhs + rhs;
173 lhs.
p0 - bottom_extra - left_extra,
174 lhs.p1 + bottom_extra - right_extra,
175 lhs.p2 - top_extra + left_extra,
176 lhs.p3 + top_extra + right_extra},
177 lengths + rhs_times_2.xyxy()};
190 return expand_and_edge_hypots(lhs, f32x4{rhs});
203 return expand_and_edge_hypots(lhs, -f32x4{rhs});
216 hilet[expanded_quad, new_lengths] = expand_and_edge_hypots(lhs, rhs);
217 return expanded_quad;
220 [[nodiscard]]
friend constexpr quad operator+(
quad const &lhs,
float rhs)
noexcept
222 return lhs + extent2{rhs, rhs};
235 hilet[expanded_quad, new_lengths] = shrink_and_edge_hypots(lhs, rhs);
236 return expanded_quad;
239 [[nodiscard]]
friend constexpr quad operator-(
quad const &lhs,
float rhs)
noexcept
241 return lhs - extent2{rhs, rhs};
244 [[nodiscard]]
friend constexpr aarectangle bounding_rectangle(quad
const &rhs)
noexcept
249 min_p =
min(min_p, rhs.p1);
250 max_p =
max(max_p, rhs.p1);
251 min_p =
min(min_p, rhs.p2);
252 max_p =
max(max_p, rhs.p2);
253 min_p =
min(min_p, rhs.p3);
254 max_p =
max(max_p, rhs.p3);
255 return aarectangle{point2{min_p}, point2{max_p}};
258 constexpr quad &operator+=(extent2
const &rhs)
noexcept
260 return *
this = *
this + rhs;
263 [[nodiscard]]
friend constexpr bool operator==(quad
const &lhs, quad
const &rhs)
noexcept =
default;
Defined the geo::extent, extent2 and extent3 types.
#define hi_no_default(...)
This part of the code should not be reachable, unless a programming bug.
Definition assert.hpp:264
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
@ bottom
Align to the bottom.
DOXYGEN BUG.
Definition algorithm.hpp:13
friend constexpr std::pair< quad, f32x4 > expand_and_edge_hypots(quad const &lhs, f32x4 const &rhs) noexcept
Add a border around the quad.
Definition quad.hpp:144
point3 p3
Right-top.
Definition quad.hpp:22
constexpr vector3 right() const noexcept
The vector from right-bottom to right-top.
Definition quad.hpp:67
friend constexpr std::pair< quad, f32x4 > shrink_and_edge_hypots(quad const &lhs, extent2 const &rhs) noexcept
Subtract a border from the quad.
Definition quad.hpp:201
point3 p1
Right-bottom.
Definition quad.hpp:20
friend constexpr quad operator+(quad const &lhs, extent2 const &rhs) noexcept
Add a border around the quad.
Definition quad.hpp:214
constexpr vector3 left() const noexcept
The vector from left-bottom to left-top.
Definition quad.hpp:60
friend constexpr quad operator-(quad const &lhs, extent2 const &rhs) noexcept
Add a border around the quad.
Definition quad.hpp:233
point3 p0
Left-bottom.
Definition quad.hpp:19
constexpr vector3 bottom() const noexcept
The vector from left-bottom to right-bottom.
Definition quad.hpp:46
constexpr vector3 top() const noexcept
The vector from left-top to right-top.
Definition quad.hpp:53
point3 p2
Left-top.
Definition quad.hpp:21
constexpr f32x4 edge_hypots() const noexcept
Return the length of each edge.
Definition quad.hpp:76
friend constexpr std::pair< quad, f32x4 > expand_and_edge_hypots(quad const &lhs, extent2 const &rhs) noexcept
Add a border around the quad.
Definition quad.hpp:188