19#ifndef AGX_VEC2_TEMPLATE_H
20#define AGX_VEC2_TEMPLATE_H
45 m_data[ 0 ] = (T)copy[ 0 ];
46 m_data[ 1 ] = (T)copy[ 1 ];
58 m_data[0] = m_data[1] = r;
78 return m_data[0] == v.m_data[0] && m_data[1] == v.m_data[1];
85 return m_data[0] != v.m_data[0] || m_data[1] != v.m_data[1];
92 return Vec2T(std::min(v1[0], v2[0]), std::min(v1[1], v2[1]));
99 return Vec2T(std::max(v1[0], v2[0]), std::max(v1[1], v2[1]));
107 return std::min(m_data[0], m_data[1]);
115 return std::max(m_data[0], m_data[1]);
123 T m = std::numeric_limits<T>::infinity();
125 for(
size_t i=0;i<2;i++)
142 for(
size_t i=0;i<2;i++)
192 m_data[0] = m_data[1] = value;
196 m_data[0] = rhs.m_data[0];
197 m_data[1] = rhs.m_data[1];
237 return m_data[0]*rhs.m_data[0] + m_data[1]*rhs.m_data[1];
243 return Vec2T( m_data[1]*rhs.m_data[2] - m_data[2]*rhs.m_data[1],
244 m_data[2]*rhs.m_data[0] - m_data[0]*rhs.m_data[2] );
245 m_data[0]*rhs.m_data[1] - m_data[1]*rhs.m_data[0] );
251 return Vec2T( m_data[0] * rhs.m_data[0],
252 m_data[1] * rhs.m_data[1] );
257 return Vec2T( m_data[0]*rhs, m_data[1]*rhs );
263 m_data[0] = m_data[0]*rhs;
264 m_data[1] = m_data[1] *rhs;
270 return Vec2T( m_data[0] / rhs, m_data[1] / rhs );
275 m_data[0] = m_data[0] / rhs;
276 m_data[1] = m_data[1] / rhs;
284 return Vec2T( lhs[0] * rhs[0],
290 return Vec2T( lhs[0] / rhs[0],
296 return Vec2T( m_data[0] + rhs.m_data[0], m_data[1] + rhs.m_data[1] );
303 m_data[0] += rhs.m_data[0];
304 m_data[1] += rhs.m_data[1];
310 return Vec2T( m_data[0] - rhs.m_data[0], m_data[1] - rhs.m_data[1] );
315 m_data[0] -= rhs.m_data[0];
316 m_data[1] -= rhs.m_data[1];
323 return Vec2T( m_data[0] + rhs, m_data[1] + rhs );
337 return Vec2T( m_data[0] - rhs, m_data[1] - rhs );
350 return Vec2T ( -m_data[0], -m_data[1] );
355 return std::sqrt( m_data[0]*m_data[0] + m_data[1]*m_data[1] );
360 return Real(m_data[0]*m_data[0] + m_data[1]*m_data[1]);
380 m_data[0] = T(m_data[0]*inv);
381 m_data[1] = T(m_data[1]*inv);
390 template <
typename T>
396 template <
typename T>
421 output << v[0] <<
" " << v[1];
429 Vec2T diff(m_data[0]-v2.m_data[0], m_data[1]-v2.m_data[1]);
438 Vec2T diff( (
UInt8) (std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] )),
439 (
UInt8) (std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] )) );
448 Vec2T diff( (
UInt16) (std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] )),
449 (
UInt16) (std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] )) );
457 Vec2T diff( std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] ),
458 std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] ) );
467 Vec2T diff( std::max( m_data[0], v2.m_data[0] ) - std::min( m_data[0], v2.m_data[0] ),
468 std::max( m_data[1], v2.m_data[1] ) - std::min( m_data[1], v2.m_data[1] ) );
473 template <
typename T>
477 result.
clamp(minimum, maximum);
size_t maxElement() const
Real length() const
Length of the vector = sqrt( vec .
bool operator!=(const Vec2T &v) const
In-equality test.
Vec2T(const Vec2T ©)=default
Copy constructor.
static Vec2T random(T min, T max)
T * ptr()
Return a pointer to the data vector.
const Vec2T operator/(T rhs) const
Divide by scalar.
Vec2T & operator-=(const Vec2T &rhs)
Unary vector subtract.
void set(const Vec2T &rhs)
size_t minElement() const
static Vec2T random(const Vec2T &min, const Vec2T &max)
T operator*(const Vec2T &rhs) const
Dot product.
const Vec2T operator+(const Vec2T &rhs) const
Binary vector add.
Real distance(const Vec2T &v2) const
Distance to another vector.
Vec2T & operator*=(T rhs)
Unary multiply by scalar.
const Vec2T operator|(const Vec2T &rhs) const
Cross product.
const T * ptr() const
Return a const pointer to the data vector.
Vec2T(const Vec2T< T2 > ©)
Copy constructor for other types.
void clamp(const Vec2T &min, const Vec2T &max)
Clamp a vector between a lower and upper bound (per component).
const Vec2T operator-() const
Negation operator.
static Vec2T mul(const Vec2T &lhs, const Vec2T &rhs)
Element-wise-multiplication.
Vec2T & operator+=(const Vec2T &rhs)
Unary vector add.
Real distance2(const Vec2T &v2) const
Squared distance to another vector.
static Vec2T componentMax(const Vec2T &v1, const Vec2T &v2)
Creates a new vector where each component is the maximum of this and the other vector.
Real normalize()
Normalize the vector so that it has length unity.
static Vec2T componentMin(const Vec2T &v1, const Vec2T &v2)
Creates a new vector where each component is the minimum of this and the other vector.
static Vec2T div(const Vec2T &lhs, const Vec2T &rhs)
bool operator==(const Vec2T &v) const
Equality test.
Real length2() const
Length squared of the vector = vec .
Vec2T()
Default constructor.
Vec2T & operator/=(T rhs)
Unary divide by scalar.
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
T absolute(T v)
return the absolute value.
T1 clamp(T1 v, T2 minimum, T3 maximum)
Vec3T< T > min(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
AGXPHYSICS_EXPORT agx::Bool equalsZero(const agx::AddedMassInteraction::Matrix6x6 &matrix, agx::Real eps=agx::RealEpsilon)
std::ostream & operator<<(std::ostream &os, const agx::AddedMassInteraction::Matrix6x6 &m)
Vec3T< T > max(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
static constexpr Real AGX_EQUIVALENT_EPSILON
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)