7#include "../utility/utility.hpp"
8#include "../macros.hpp"
9#include <hikocpu/hikocpu.hpp>
15hi_export_module(hikogui.geometry : vector2);
17hi_export
namespace hi {
30 using value_type = array_type::value_type;
32 constexpr vector2(vector2
const&)
noexcept =
default;
33 constexpr vector2(vector2&&)
noexcept =
default;
34 constexpr vector2& operator=(vector2
const&)
noexcept =
default;
35 constexpr vector2& operator=(vector2&&)
noexcept =
default;
39 [[nodiscard]]
constexpr explicit operator array_type() const noexcept
53 [[nodiscard]]
constexpr vector2() noexcept : _v(0.0f, 0.0f, 0.0f, 0.0f) {}
60 [[nodiscard]]
constexpr vector2(
float x,
float y) noexcept : _v(
x,
y, 0.0f, 0.0f) {}
65 [[nodiscard]]
constexpr float&
x() noexcept
73 [[nodiscard]]
constexpr float&
y() noexcept
81 [[nodiscard]]
constexpr float x() const noexcept
89 [[nodiscard]]
constexpr float y() const noexcept
97 [[nodiscard]]
constexpr vector2
operator-() const noexcept
104 return *
this = *
this + rhs;
109 return *
this = *
this - rhs;
112 constexpr vector2& operator*=(
float const& rhs)
noexcept
114 return *
this = *
this * rhs;
122 [[nodiscard]]
constexpr friend vector2
operator+(vector2
const& lhs, vector2
const& rhs)
noexcept
124 return vector2{lhs._v + rhs._v};
132 [[nodiscard]]
constexpr friend vector2
operator-(vector2
const& lhs, vector2
const& rhs)
noexcept
134 return vector2{lhs._v - rhs._v};
142 [[nodiscard]]
constexpr friend vector2
operator*(vector2
const& lhs,
float const& rhs)
noexcept
144 return vector2{lhs._v * array_type::broadcast(rhs)};
152 [[nodiscard]]
constexpr friend vector2
operator*(
float const& lhs, vector2
const& rhs)
noexcept
154 return vector2{array_type::broadcast(lhs) * rhs._v};
162 [[nodiscard]]
constexpr friend bool operator==(vector2
const& lhs, vector2
const& rhs)
noexcept
164 return equal(lhs._v, rhs._v);
171 [[nodiscard]]
constexpr friend float squared_hypot(vector2
const& rhs)
noexcept
180 [[nodiscard]]
friend float hypot(vector2
const& rhs)
noexcept
189 [[nodiscard]]
constexpr friend float rcp_hypot(vector2
const& rhs)
noexcept
191 return rhypot<0b0011>(rhs._v).x();
198 [[nodiscard]]
constexpr friend vector2
normalize(vector2
const& rhs)
noexcept
208 [[nodiscard]]
constexpr friend float dot(vector2
const& lhs, vector2
const& rhs)
noexcept
218 [[nodiscard]]
constexpr friend float det(vector2
const& lhs, vector2
const& rhs)
noexcept
220 return lhs.x() * rhs.y() - lhs.y() * rhs.x();
227 [[nodiscard]]
constexpr friend vector2
cross(vector2
const& rhs)
noexcept
229 return vector2{-rhs._v.y(), rhs._v.x()};
240 [[nodiscard]]
constexpr friend float cross(vector2
const& lhs, vector2
const& rhs)
noexcept
242 auto const tmp1 = rhs._v.yxwz();
243 auto const tmp2 = lhs._v * tmp1;
244 auto const tmp3 = hsub(tmp2, tmp2);
252 [[nodiscard]]
constexpr friend vector2
normal(vector2
const& rhs)
noexcept
262 [[nodiscard]]
friend constexpr vector2
min(vector2
const& lhs, vector2
const& rhs)
noexcept
264 return vector2{
min(
static_cast<array_type
>(lhs),
static_cast<array_type
>(rhs))};
272 [[nodiscard]]
friend constexpr vector2
max(vector2
const& lhs, vector2
const& rhs)
noexcept
274 return vector2{
max(
static_cast<array_type
>(lhs),
static_cast<array_type
>(rhs))};
279 [[nodiscard]]
friend constexpr vector2
round(vector2
const& rhs)
noexcept
281 return vector2{
round(
static_cast<array_type
>(rhs))};
286 [[nodiscard]]
friend constexpr vector2
ceil(vector2
const& rhs)
noexcept
288 return vector2{
ceil(
static_cast<array_type
>(rhs))};
293 [[nodiscard]]
friend constexpr vector2
floor(vector2
const& rhs)
noexcept
295 return vector2{
floor(
static_cast<array_type
>(rhs))};
303 return _v.z() == 0.0f and _v.w() == 0.0f;
308 return std::format(
"({}, {})", rhs._v.x(), rhs._v.y());
313 return lhs << to_string(rhs);
325struct std::formatter<
hi::vector2, char> : std::formatter<std::string, char> {
328 return std::formatter<std::string, char>::format(std::format(
"({}, {})", t.
x(), t.
y()), fc);
@ other
The gui_event does not have associated data.
Definition gui_event_variant.hpp:24
The HikoGUI namespace.
Definition array_generic.hpp:21
The HikoGUI API version 1.
Definition array_generic.hpp:22
Definition simd_intf.hpp:18
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector2.hpp:27
constexpr vector2() noexcept
Construct a empty vector / zero length.
Definition vector2.hpp:53
constexpr float & x() noexcept
Access the x element from the vector.
Definition vector2.hpp:65
constexpr float y() const noexcept
Access the y element from the vector.
Definition vector2.hpp:89
constexpr vector2(array_type const &other) noexcept
Construct a vector from a array_type-simd.
Definition vector2.hpp:46
friend constexpr vector2 round(vector2 const &rhs) noexcept
Round the elements of the vector toward nearest integer.
Definition vector2.hpp:279
constexpr bool holds_invariant() const noexcept
Check if the vector is valid.
Definition vector2.hpp:301
constexpr friend vector2 normalize(vector2 const &rhs) noexcept
Normalize a vector to a unit vector.
Definition vector2.hpp:198
constexpr vector2(float x, float y) noexcept
Construct a 3D vector from x, y and z elements.
Definition vector2.hpp:60
constexpr friend vector2 cross(vector2 const &rhs) noexcept
Get the cross product of one 2D vectors.
Definition vector2.hpp:227
constexpr friend float dot(vector2 const &lhs, vector2 const &rhs) noexcept
Get the dot product between two vectors.
Definition vector2.hpp:208
friend constexpr vector2 max(vector2 const &lhs, vector2 const &rhs) noexcept
Mix the two vectors and get the highest value of each element.
Definition vector2.hpp:272
friend constexpr vector2 ceil(vector2 const &rhs) noexcept
Round the elements of the vector toward upward and to the right.
Definition vector2.hpp:286
friend constexpr vector2 floor(vector2 const &rhs) noexcept
Round the elements of the vector toward downward and to the left.
Definition vector2.hpp:293
constexpr friend vector2 normal(vector2 const &rhs) noexcept
Get the normal on a 2D vector.
Definition vector2.hpp:252
friend float hypot(vector2 const &rhs) noexcept
Get the length of the vector.
Definition vector2.hpp:180
constexpr friend bool operator==(vector2 const &lhs, vector2 const &rhs) noexcept
Compare if two vectors are equal.
Definition vector2.hpp:162
constexpr friend vector2 operator*(float const &lhs, vector2 const &rhs) noexcept
Scale the vector by a scaler.
Definition vector2.hpp:152
constexpr friend float cross(vector2 const &lhs, vector2 const &rhs) noexcept
Get the cross product between two 2D vectors.
Definition vector2.hpp:240
constexpr friend vector2 operator+(vector2 const &lhs, vector2 const &rhs) noexcept
Add two vectors from each other.
Definition vector2.hpp:122
constexpr friend vector2 operator-(vector2 const &lhs, vector2 const &rhs) noexcept
Subtract two vectors from each other.
Definition vector2.hpp:132
constexpr float & y() noexcept
Access the y element from the vector.
Definition vector2.hpp:73
constexpr friend float det(vector2 const &lhs, vector2 const &rhs) noexcept
Get the determinate between two vectors.
Definition vector2.hpp:218
constexpr friend float rcp_hypot(vector2 const &rhs) noexcept
Get the length of the vector.
Definition vector2.hpp:189
constexpr friend float squared_hypot(vector2 const &rhs) noexcept
Get the squared length of the vector.
Definition vector2.hpp:171
constexpr float x() const noexcept
Access the x element from the vector.
Definition vector2.hpp:81
constexpr friend vector2 operator*(vector2 const &lhs, float const &rhs) noexcept
Scale the vector by a scaler.
Definition vector2.hpp:142
constexpr vector2 operator-() const noexcept
Mirror this vector.
Definition vector2.hpp:97
friend constexpr vector2 min(vector2 const &lhs, vector2 const &rhs) noexcept
Mix the two vectors and get the lowest value of each element.
Definition vector2.hpp:262