7#include "../rapid/numeric_array.hpp"
9namespace hi::inline
v1 {
23 static_assert(D == 2 || D == 3,
"Only 2D or 3D vectors are supported");
27 constexpr vector& operator=(
vector const&)
noexcept =
default;
28 constexpr vector& operator=(
vector&&)
noexcept =
default;
33 requires(E < D) [[nodiscard]]
constexpr vector(
vector<E> const& other) noexcept : _v(
static_cast<f32x4>(other))
42 requires(E > D) [[nodiscard]]
constexpr explicit vector(
vector<E> const& other) noexcept : _v(
static_cast<f32x4>(other))
52 [[nodiscard]]
constexpr explicit operator f32x4() const noexcept
59 [[nodiscard]]
constexpr explicit vector(
f32x4 const& other) noexcept : _v(other)
66 [[nodiscard]]
constexpr vector() noexcept : _v(0.0f, 0.0f, 0.0f, 0.0f) {}
72 [[nodiscard]]
constexpr vector(
float x,
float y)
noexcept requires(D == 2) : _v(x, y, 0.0f, 0.0f) {}
79 [[nodiscard]]
constexpr vector(
float x,
float y,
float z = 0.0f) noexcept requires(D == 3) : _v(x, y, z, 0.0f) {}
84 [[nodiscard]]
constexpr float&
x() noexcept
92 [[nodiscard]]
constexpr float&
y() noexcept
100 [[nodiscard]]
constexpr float&
z() noexcept requires(D == 3)
108 [[nodiscard]]
constexpr float const&
x() const noexcept
116 [[nodiscard]]
constexpr float const&
y() const noexcept
124 [[nodiscard]]
constexpr float const&
z() const noexcept requires(D == 3)
139 requires(E <= D)
constexpr vector&
operator+=(
vector<E> const& rhs)
noexcept
141 hi_axiom(holds_invariant() && rhs.holds_invariant());
142 _v = _v +
static_cast<f32x4>(rhs);
153 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
154 return vector{lhs._v + rhs._v};
164 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
165 return vector{lhs._v - rhs._v};
176 return vector{lhs._v * rhs};
187 return vector{f32x4::broadcast(lhs) * rhs._v};
197 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
198 return lhs._v == rhs._v;
208 return squared_hypot<element_mask>(rhs._v);
215 [[nodiscard]]
constexpr friend float hypot(
vector const& rhs)
noexcept
218 return hypot<element_mask>(rhs._v);
228 return rcp_hypot<element_mask>(rhs._v);
238 return vector{normalize<element_mask>(rhs._v)};
246 [[nodiscard]]
constexpr friend float dot(
vector const& lhs,
vector const& rhs)
noexcept
248 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
249 return dot<element_mask>(lhs._v, rhs._v);
257 [[nodiscard]]
constexpr friend float det(
vector const& lhs,
vector const& rhs)
noexcept requires (D == 2)
259 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
260 return lhs.x() * rhs.y() - lhs.y() * rhs.x();
311 return _v.w() == 0.0f && (D == 3 || _v.z() == 0.0f);
316 if constexpr (D == 2) {
317 return std::format(
"({}, {})", rhs._v.x(), rhs._v.y());
318 }
else if constexpr (D == 3) {
319 return std::format(
"({}, {}, {})", rhs._v.x(), rhs._v.y(), rhs._v.z());
333 static constexpr std::size_t element_mask = (1_uz << D) - 1;
340[[nodiscard]]
constexpr vector<2> cross(vector<2>
const& rhs)
noexcept
343 return vector<2>{cross_2D(
static_cast<f32x4
>(rhs))};
350[[nodiscard]]
constexpr vector<2> normal(vector<2>
const& rhs)
noexcept
353 return normalize(cross(rhs));
361[[nodiscard]]
constexpr vector<3> normal(vector<3>
const& rhs,
float angle)
noexcept
366 return normal(vector<2>{f32x4{rhs}.xy00()});
377[[nodiscard]]
constexpr float cross(vector<2>
const& lhs, vector<2>
const& rhs)
noexcept
379 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
380 return cross_2D(
static_cast<f32x4
>(lhs),
static_cast<f32x4
>(rhs));
388[[nodiscard]]
constexpr vector<3> cross(vector<3>
const& lhs, vector<3>
const& rhs)
noexcept
390 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
391 return vector<3>{cross_3D(
static_cast<f32x4
>(lhs),
static_cast<f32x4
>(rhs))};
396using vector2 = geo::vector<2>;
397using vector3 = geo::vector<3>;
401template<
typename CharT>
402struct std::formatter<
hi::geo::vector<2>, CharT> {
408 auto format(hi::geo::vector<2>
const& t,
auto& fc)
410 return std::vformat_to(fc.out(),
"({}, {})", std::make_format_args(t.x(), t.y()));
414template<
typename CharT>
415struct std::formatter<
hi::geo::vector<3>, CharT> : std::formatter<float, CharT> {
421 auto format(hi::geo::vector<3>
const& t,
auto& fc)
423 return std::vformat_to(fc.out(),
"({}, {}, {})", std::make_format_args(t.x(), t.y(), t.z()));
#define hi_axiom(expression)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
#define hi_not_implemented()
This part of the code has not been implemented yet.
Definition assert.hpp:182
#define hi_static_no_default()
This part of the code should not be reachable, unless a programming bug.
Definition assert.hpp:172
DOXYGEN BUG.
Definition algorithm.hpp:15
The HikoGUI namespace.
Definition ascii.hpp:19
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector.hpp:21
constexpr vector(float x, float y) noexcept
Construct a 2D vector from x and y elements.
Definition vector.hpp:72
constexpr vector(float x, float y, float z=0.0f) noexcept
Construct a 3D vector from x, y and z elements.
Definition vector.hpp:79
constexpr friend float hypot(vector const &rhs) noexcept
Get the length of the vector.
Definition vector.hpp:215
constexpr vector(vector< E > const &other) noexcept
Construct a vector from a higher dimension vector.
Definition vector.hpp:42
friend constexpr auto min(vector const &lhs, vector< E > const &rhs) noexcept
Mix the two vectors and get the lowest value of each element.
Definition vector.hpp:269
constexpr friend bool operator==(vector const &lhs, vector const &rhs) noexcept
Compare if two vectors are equal.
Definition vector.hpp:195
constexpr bool holds_invariant() const noexcept
Check if the vector is valid.
Definition vector.hpp:309
friend constexpr vector round(vector const &rhs) noexcept
Round the elements of the vector toward nearest integer.
Definition vector.hpp:287
constexpr vector() noexcept
Construct a empty vector / zero length.
Definition vector.hpp:66
constexpr vector(f32x4 const &other) noexcept
Construct a vector from a f32x4-numeric_array.
Definition vector.hpp:59
constexpr friend vector normalize(vector const &rhs) noexcept
Normalize a vector to a unit vector.
Definition vector.hpp:235
constexpr friend vector operator*(float const &lhs, vector const &rhs) noexcept
Scale the vector by a scaler.
Definition vector.hpp:184
constexpr float & z() noexcept
Access the z element from the vector.
Definition vector.hpp:100
constexpr friend vector operator-(vector const &lhs, vector const &rhs) noexcept
Subtract two vectors from each other.
Definition vector.hpp:162
friend constexpr vector floor(vector const &rhs) noexcept
Round the elements of the vector toward downward and to the left.
Definition vector.hpp:301
constexpr vector operator-() const noexcept
Mirror this vector.
Definition vector.hpp:132
constexpr friend vector operator*(vector const &lhs, float const &rhs) noexcept
Scale the vector by a scaler.
Definition vector.hpp:173
constexpr float const & y() const noexcept
Access the y element from the vector.
Definition vector.hpp:116
constexpr friend float squared_hypot(vector const &rhs) noexcept
Get the squared length of the vector.
Definition vector.hpp:205
constexpr friend float det(vector const &lhs, vector const &rhs) noexcept
Get the determinate between two vectors.
Definition vector.hpp:257
friend constexpr vector ceil(vector const &rhs) noexcept
Round the elements of the vector toward upward and to the right.
Definition vector.hpp:294
constexpr friend float dot(vector const &lhs, vector const &rhs) noexcept
Get the dot product between two vectors.
Definition vector.hpp:246
constexpr float & y() noexcept
Access the y element from the vector.
Definition vector.hpp:92
constexpr vector(vector< E > const &other) noexcept
Construct a vector from a lower dimension vector.
Definition vector.hpp:33
constexpr friend float rcp_hypot(vector const &rhs) noexcept
Get the length of the vector.
Definition vector.hpp:225
constexpr float & x() noexcept
Access the x element from the vector.
Definition vector.hpp:84
constexpr friend vector operator+(vector const &lhs, vector const &rhs) noexcept
Add two vectors from each other.
Definition vector.hpp:151
constexpr float const & x() const noexcept
Access the x element from the vector.
Definition vector.hpp:108
constexpr float const & z() const noexcept
Access the z element from the vector.
Definition vector.hpp:124
friend constexpr auto max(vector const &lhs, vector< E > const &rhs) noexcept
Mix the two vectors and get the highest value of each element.
Definition vector.hpp:280