9#include "translate2.hpp"
10#include "translate3.hpp"
15#include "perspective.hpp"
23#include "rectangle.hpp"
31namespace hi {
inline namespace v1 {
66 return matrix2{lhs * get<0>(rhs), lhs * get<1>(rhs), lhs * get<2>(rhs), lhs * get<3>(rhs)};
73 return matrix3{lhs * get<0>(rhs), lhs * get<1>(rhs), lhs * get<2>(rhs), lhs * get<3>(rhs)};
76[[nodiscard]]
constexpr matrix2 operator*(translate2
const& lhs, matrix2
const& rhs)
noexcept
78 return matrix2{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs) + f32x4{lhs}};
81[[nodiscard]]
constexpr matrix3 operator*(translate3
const& lhs, matrix3
const& rhs)
noexcept
83 return matrix3{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs) + f32x4{lhs}};
86[[nodiscard]]
constexpr translate2 operator*(translate2
const& lhs, translate2
const& rhs)
noexcept
88 return translate2{f32x4{lhs} + f32x4{rhs}};
91[[nodiscard]]
constexpr translate3 operator*(translate3
const& lhs, translate3
const& rhs)
noexcept
93 return translate3{f32x4{lhs} + f32x4{rhs}};
96[[nodiscard]]
constexpr matrix2 operator*(translate2
const& lhs, scale2
const& rhs)
noexcept
98 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
99 return matrix2{f32x4{rhs}.x000(), f32x4{rhs}._0y00(), f32x4{rhs}._00z0(), f32x4{lhs}.xyz1()};
102[[nodiscard]]
constexpr matrix3 operator*(translate3
const& lhs, scale3
const& rhs)
noexcept
104 return matrix3{f32x4{rhs}.x000(), f32x4{rhs}._0y00(), f32x4{rhs}._00z0(), f32x4{lhs}.xyz1()};
107[[nodiscard]]
constexpr matrix2 operator*(translate2
const& lhs, rotate2
const& rhs)
noexcept
109 return lhs * matrix2(rhs);
112[[nodiscard]]
constexpr matrix3 operator*(translate3
const& lhs, rotate3
const& rhs)
noexcept
114 return lhs * matrix3(rhs);
117[[nodiscard]]
constexpr matrix2 operator*(scale2
const& lhs, translate2
const& rhs)
noexcept
119 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
120 return matrix2{f32x4{lhs}.x000(), f32x4{lhs}._0y00(), f32x4{lhs}._00z0(), f32x4{lhs} * f32x4{rhs}.xyz1()};
123[[nodiscard]]
constexpr matrix3 operator*(scale3
const& lhs, translate3
const& rhs)
noexcept
125 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
126 return matrix3{f32x4{lhs}.x000(), f32x4{lhs}._0y00(), f32x4{lhs}._00z0(), f32x4{lhs} * f32x4{rhs}.xyz1()};
129[[nodiscard]]
constexpr scale2 operator*(scale2
const& lhs, scale2
const& rhs)
noexcept
131 return scale2{f32x4{lhs} * f32x4{rhs}};
134[[nodiscard]]
constexpr scale3 operator*(scale3
const& lhs, scale3
const& rhs)
noexcept
136 return scale3{f32x4{lhs} * f32x4{rhs}};
146[[nodiscard]]
inline float operator*(
matrix2 const& lhs,
float const& rhs)
noexcept
149 hilet abs_scale = hypot<0b0011>(get<0>(lhs) * f32x4::broadcast(rhs));
160[[nodiscard]]
inline float operator*(
matrix3 const &lhs,
float const& rhs)
noexcept
163 hilet abs_scale = hypot<0b0111>(get<0>(lhs) * f32x4::broadcast(rhs));
169[[nodiscard]]
constexpr float operator*(translate2
const&,
float const& rhs)
noexcept
174[[nodiscard]]
constexpr float operator*(translate3
const&,
float const& rhs)
noexcept
179[[nodiscard]]
constexpr float operator*(scale2
const& lhs,
float const& rhs)
noexcept
181 return lhs.x() * rhs;
184[[nodiscard]]
constexpr float operator*(scale3
const& lhs,
float const& rhs)
noexcept
186 return lhs.x() * rhs;
189[[nodiscard]]
constexpr float operator*(rotate2
const&,
float const& rhs)
noexcept
194[[nodiscard]]
constexpr float operator*(rotate3
const&,
float const& rhs)
noexcept
208 return vector2{get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy()};
211[[nodiscard]]
constexpr vector2 operator*(translate2
const&, vector2
const& rhs)
noexcept
216[[nodiscard]]
constexpr vector2 operator*(translate3
const&, vector2
const& rhs)
noexcept
221[[nodiscard]]
constexpr vector2 operator*(scale2
const& lhs, vector2
const& rhs)
noexcept
223 return vector2{f32x4{lhs} * f32x4{rhs}};
226[[nodiscard]]
constexpr vector2 operator*(scale3
const& lhs, vector2
const& rhs)
noexcept
228 return vector2{f32x4{lhs} * f32x4{rhs}};
240 return vector3{get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy() + get<2>(lhs) * f32x4{rhs}.zzzz()};
243[[nodiscard]]
constexpr vector3 operator*(translate3
const&, vector3
const& rhs)
noexcept
248[[nodiscard]]
constexpr vector3 operator*(scale3
const& lhs, vector3
const& rhs)
noexcept
250 return vector3{f32x4{lhs} * f32x4{rhs}};
258[[nodiscard]]
constexpr point2 operator*(
matrix2 const& lhs, point2
const& rhs)
noexcept
260 return point2{get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy() + get<3>(lhs)};
263[[nodiscard]]
constexpr point2 operator*(translate2
const& lhs, point2
const& rhs)
noexcept
265 return point2{f32x4{lhs} + f32x4{rhs}};
268[[nodiscard]]
constexpr point2 operator*(scale2
const& lhs, point2
const& rhs)
noexcept
270 return point2{f32x4{lhs} * f32x4{rhs}};
273[[nodiscard]]
constexpr point2 operator*(scale3
const& lhs, point2
const& rhs)
noexcept
275 return point2{f32x4{lhs} * f32x4{rhs}};
283[[nodiscard]]
constexpr point3 operator*(
matrix3 const& lhs, point3
const& rhs)
noexcept
286 get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy() + get<2>(lhs) * f32x4{rhs}.zzzz() +
287 get<3>(lhs) * f32x4{rhs}.wwww()};
290[[nodiscard]]
constexpr point3 operator*(translate3
const& lhs, point3
const& rhs)
noexcept
292 return point3{f32x4{lhs} + f32x4{rhs}};
295[[nodiscard]]
constexpr point3 operator*(scale3
const& lhs, point3
const& rhs)
noexcept
297 return point3{f32x4{lhs} * f32x4{rhs}};
300[[nodiscard]]
constexpr extent2 operator*(transformer2
auto const& lhs, extent2
const& rhs)
noexcept
302 return extent2{lhs *vector2{rhs}};
305[[nodiscard]]
constexpr extent3 operator*(transformer3
auto const& lhs, std::convertible_to<extent3>
auto const& rhs)
noexcept
307 return extent3{lhs *vector3{rhs}};
310[[nodiscard]]
constexpr aarectangle operator*(translate2
const& lhs, aarectangle
const& rhs)
noexcept
312 return aarectangle{lhs * get<0>(rhs), lhs * get<3>(rhs)};
319 return aarectangle{lhs * get<0>(rhs), lhs * get<3>(rhs)};
334 return rectangle{lhs * rhs_.origin, lhs * rhs_.right, lhs * rhs_.up};
343[[deprecated(
"Use full_mul() or fast_mul() instead.")]] [[nodiscard]]
constexpr rectangle
347 return rectangle{lhs * rhs_.origin, lhs * rhs_.right, lhs * rhs_.up};
359 return rectangle{lhs * rhs_.origin, lhs * rhs_.right, lhs * rhs_.up};
370 return aarectangle{lhs * get<0>(rhs), lhs * get<3>(rhs)};
379[[nodiscard]]
constexpr rectangle operator*(transformer
auto const& lhs,
rectangle const& rhs)
noexcept
381 return rectangle{lhs * rhs.origin, lhs * rhs.right, lhs * rhs.up};
389[[nodiscard]]
constexpr quad operator*(transformer
auto const& lhs, quad
const& rhs)
noexcept
391 return quad{lhs * rhs.p0, lhs * rhs.p1, lhs * rhs.p2, lhs * rhs.p3};
399[[nodiscard]]
constexpr circle operator*(transformer
auto const& lhs,
circle const& rhs)
noexcept
401 return circle{lhs * midpoint(rhs), lhs * rhs.radius()};
411 return line_segment{lhs * rhs.origin(), lhs * rhs.direction()};
421 return {lhs * get<0>(rhs), lhs * get<1>(rhs), lhs * get<2>(rhs), lhs * get<3>(rhs)};
430template<
typename Lhs, transformer Rhs>
432 requires requires(Lhs& a, Rhs
const& b) { a = b * a; }
434 return lhs = rhs * lhs;
437[[nodiscard]]
constexpr aarectangle fit(aarectangle
const& bounds, aarectangle
const&
rectangle)
noexcept
439 hilet resized_rectangle = aarectangle{
445 hilet translate_from_p0 =
max(vector2{}, get<0>(bounds) - get<0>(resized_rectangle));
446 hilet translate_from_p3 =
min(vector2{}, get<3>(bounds) - get<3>(resized_rectangle));
447 return translate2{translate_from_p0 + translate_from_p3} * resized_rectangle;
460 hilet top_extra = (lhs.top() * rhs.x() - lhs.top()) * 0.5f;
461 hilet bottom_extra = (lhs.bottom() * rhs.x() - lhs.bottom()) * 0.5f;
462 hilet left_extra = (lhs.left() * rhs.y() - lhs.left()) * 0.5f;
463 hilet right_extra = (lhs.right() * rhs.y() - lhs.right()) * 0.5f;
466 lhs.p0 - bottom_extra - left_extra,
467 lhs.p1 + bottom_extra - right_extra,
468 lhs.p2 - top_extra + left_extra,
469 lhs.p3 + top_extra + right_extra};
Defined the corner_radii type.
Defined the geo::extent, extent2 and extent3 types.
Defined the geo::extent, extent2 and extent3 types.
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
@ rectangle
The gui_event has rectangle data.
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
constexpr aarectangle fast_mul(matrix2 const &lhs, aarectangle const &rhs) noexcept
Transform an axis-aligned rectangle without rotation by the matrix.
Definition transform.hpp:368
constexpr rectangle full_mul(matrix2 const &lhs, aarectangle const &rhs) noexcept
Transform an axis-aligned rectangle without rotation by the matrix.
Definition transform.hpp:356
constexpr Lhs & operator*=(Lhs &lhs, Rhs const &rhs) noexcept
Inplace geometric translation.
Definition transform.hpp:431
constexpr quad scale_from_center(quad const &lhs, scale2 const &rhs) noexcept
scale the quad.
Definition transform.hpp:458
Class which represents an axis-aligned rectangle.
Definition aarectangle.hpp:26
A type defining a 2D circle.
Definition circle.hpp:18
The 4 radii of the corners of a quad or rectangle.
Definition corner_radii.hpp:18
Line segment.
Definition line_segment.hpp:20
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix2.hpp:26
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix3.hpp:29
Perspective transform.
Definition perspective.hpp:15
A rectangle / parallelogram in 3D space.
Definition rectangle.hpp:20
Definition rotate3.hpp:11
Definition transform.hpp:34
Definition transform.hpp:36
Definition translate2.hpp:13
Definition translate3.hpp:17
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector2.hpp:18
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector3.hpp:19
Definition transform.hpp:56
Definition transform.hpp:58
Definition transform.hpp:60