12#ifndef JAU_MATH_VEC2I_HPP_
13#define JAU_MATH_VEC2I_HPP_
39 std::enable_if_t<std::is_integral_v<Value_type> &&
99 explicit operator pointer() noexcept {
return &
x; }
113 return x == rhs.x &&
y == rhs.y;
121 {
x=vx;
y=vy;
return *
this; }
125 {
x=xy[0];
y=xy[1];
return *
this; }
129 {
x+=d.x;
y+=d.y;
return *
this; }
133 {
x+=dx;
y+=dy;
return *
this; }
137 {
x*=s.x;
y*=s.y;
return *
this; }
141 {
x*=sx;
y*=sy;
return *
this; }
145 {
x*=s;
y*=s;
return *
this; }
211 std::string
toString() const noexcept {
return std::to_string(
x)+
", "+std::to_string(
y); }
248 return x == o.
x &&
y == o.
y;
253 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
265 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
271 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
279 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
285 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
291 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
297 std::enable_if_t<std::is_floating_point_v<T>,
bool> =
true>
300 r.
x=s/r.
x; r.
y=s/r.
y;
305 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
307 return Vector2I<T>(std::min(lhs.x, rhs.x), std::min(lhs.y, rhs.y));
311 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
313 return Vector2I<T>(std::max(lhs.x, rhs.x), std::max(lhs.y, rhs.y));
317 std::enable_if_t<std::is_floating_point_v<T>,
bool> =
true>
319 return Vector2I<T>(std::abs(lhs.x), std::abs(lhs.y));
323 std::enable_if_t<std::numeric_limits<T>::is_integer,
bool> =
true>
325 return out << v.toString();
331 static_assert(
sizeof(int) ==
alignof(
Vec2i));
333 static_assert(
sizeof(int)*2 ==
sizeof(
Vec2i));
339 std::enable_if_t<std::numeric_limits<Value_type>::is_integer &&
346 static_assert(
sizeof(int) ==
alignof(
Point2i));
348 static_assert(
sizeof(int)*2 ==
sizeof(
Point2i));
2D vector using two value_type components.
constexpr Vector2I & operator-=(const Vector2I &rhs) noexcept
this = this - rhs, component wise.
constexpr Vector2I(const Vector2I &o) noexcept=default
static constexpr const value_type zero
constexpr Vector2I & add(const Vector2I &d) noexcept
this = this + {d.x, d.y}, component wise.
constexpr Vector2I(Vector2I &&o) noexcept=default
constexpr Vector2I & mul(const Vector2I &s) noexcept
this = this * {s.x, s.y}, component wise.
constexpr iterator get(iterator xy) const noexcept
xy = this, returns xy.
const value_type * const_pointer
constexpr Vector2I() noexcept
constexpr value_type length_sq() const noexcept
Return the squared length of this vector, a.k.a the squared norm or squared magnitude
constexpr Vector2I & operator+=(const Vector2I &rhs) noexcept
this = this + rhs, component wise.
constexpr const_iterator cbegin() const noexcept
constexpr bool is_zero() const noexcept
constexpr Vector2I & scale(const value_type s) noexcept
this = this * s, component wise.
constexpr Vector2I & operator*=(const Vector2I &s) noexcept
this = this * {s.x, s.y}, component wise.
constexpr Vector2I(const value_type x_, const value_type y_) noexcept
constexpr Vector2I & set(const value_type vx, const value_type vy) noexcept
TODO constexpr bool operator<=>(const vec2i_t& rhs ) const noexcept { return ... }...
constexpr Vector2I & operator=(Vector2I &&) noexcept=default
constexpr value_type length() const noexcept
Return the length of this vector, a.k.a the norm or magnitude
static constexpr int value_alignment
jau::float_bytes< sizeof(value_type)>::type float_type
bool intersects(const Vector2I &o)
static constexpr const size_t byte_size
std::string toString() const noexcept
constexpr value_type operator[](size_t i) const noexcept
Returns read-only component.
void rotate(const float_type sin, const float_type cos, const Vector2I &ctr)
constexpr Vector2I & operator*=(const value_type s) noexcept
this = this * s, component wise.
constexpr bool operator==(const Vector2I &rhs) const noexcept
constexpr_cxx26 void rotate(const float_type radians, const Vector2I &ctr)
constexpr Vector2I & operator=(const Vector2I &) noexcept=default
constexpr Vector2I & set(const_iterator xy) noexcept
this = xy, returns this.
constexpr Vector2I & add(const value_type dx, const value_type dy) noexcept
this = this + {sx, sy}, component wise.
constexpr Vector2I(const value_type v) noexcept
constexpr iterator begin() noexcept
constexpr Vector2I & mul(const value_type sx, const value_type sy) noexcept
this = this * {sx, sy}, component wise.
constexpr Vector2I copy() noexcept
const value_type & const_reference
constexpr Vector2I & normalize() noexcept
Normalize this vector in place, returns *this.
static constexpr const value_type one
constexpr Vector2I & operator/=(const value_type s) noexcept
this = this * s, component wise.
static constexpr const size_t components
constexpr reference operator[](size_t i) noexcept
Returns writeable reference to component.
const value_type * const_iterator
constexpr Vector2I & operator/=(const Vector2I &s) noexcept
this = this / {s.x, s.y}, component wise.
std::enable_if_t< std::is_floating_point_v< T >, bool > constexpr is_zero(const T &a, const T &epsilon=std::numeric_limits< T >::epsilon()) noexcept
Returns true if the given value is less than epsilon, w/ epsilon > 0.
constexpr jau::sint_bytes_t< sizeof(T)> round_to_int(const T v) noexcept
Returns the rounded value cast to int.
constexpr Quaternion< T > operator-(const Quaternion< T > &lhs, const Quaternion< T > &rhs) noexcept
constexpr Vector2F< T > operator/(const Vector2F< T > &lhs, const T s) noexcept
constexpr Vector2F< T > max(const Vector2F< T > &lhs, const Vector2F< T > &rhs) noexcept
constexpr Vector2F< T > min(const Vector2F< T > &lhs, const Vector2F< T > &rhs) noexcept
constexpr Matrix4< T > operator*(const Matrix4< T > &lhs, const Matrix4< T > &rhs) noexcept
constexpr Quaternion< T > operator+(const Quaternion< T > &lhs, const Quaternion< T > &rhs) noexcept
std::ostream & operator<<(std::ostream &out, const Matrix4< T > &v) noexcept
constexpr Vector2F< T > abs(const Vector2F< T > &lhs) noexcept
Vector2I< Value_type > Point2I
Point2I alias of Vector2I.