15#ifndef MOMENTUM_VEC4_H
16#define MOMENTUM_VEC4_H
18#include "momentum_namespace.h"
19#include "momentum_math.h"
48 explicit Vec4(
double r );
51 Vec4(
double x,
double y,
double z,
double w );
54 explicit Vec4(
const double v[4] );
116 void set(
double x,
double y,
double z,
double w );
119 void set(
double value );
143 void setX(
double value);
145 void setY(
double value);
147 void setZ(
double value);
149 void setW(
double value);
270 std::string __str__()
const;
284 m_data[ 0 ] = copy.m_data[ 0 ];
285 m_data[ 1 ] = copy.m_data[ 1 ];
286 m_data[ 2 ] = copy.m_data[ 2 ];
287 m_data[ 3 ] = copy.m_data[ 3 ];
293 m_data[0] = double();
294 m_data[1] = double();
295 m_data[2] = double();
296 m_data[3] = double();
302 m_data[0] = m_data[1] = m_data[2] = m_data[3] = r;
326 m_data[0] = double(v3[0]);
327 m_data[1] = double(v3[1]);
328 m_data[2] = double(v3[2]);
336 return m_data[0] == v.m_data[0] && m_data[1] == v.m_data[1] && m_data[2] == v.m_data[2] && m_data[3] == v.m_data[3];
342 return m_data[0] != v.m_data[0] || m_data[1] != v.m_data[1] || m_data[2] != v.m_data[2] || m_data[3] != v.m_data[3];
349 return Vec4(std::min(
v1[0], v2[0]), std::min(
v1[1], v2[1]), std::min(
v1[2], v2[2]), std::min(
v1[3], v2[3]));
355 return Vec4(std::max(
v1[0], v2[0]), std::max(
v1[1], v2[1]), std::max(
v1[2], v2[2]), std::max(
v1[3], v2[3]));
361 return std::min(std::min(std::min(m_data[0], m_data[1]), m_data[2]), m_data[3]);
367 return std::max(std::max(std::max(m_data[0], m_data[1]), m_data[2]), m_data[3]);
373 double m = std::numeric_limits<double>::infinity();
375 for(
int i = 0; i < 4; i++) {
376 double a = agx::absolute(m_data[i]);
390 for(
int i = 0; i < 4; i++) {
391 double a = agx::absolute(m_data[i]);
403 m_data[0] = agx::clamp( m_data[0],
min.m_data[0],
max.m_data[0] );
404 m_data[1] = agx::clamp( m_data[1],
min.m_data[1],
max.m_data[1] );
405 m_data[2] = agx::clamp( m_data[2],
min.m_data[2],
max.m_data[2] );
406 m_data[3] = agx::clamp( m_data[3],
min.m_data[3],
max.m_data[3] );
413 return (agx::equalsZero(m_data[0]) && agx::equalsZero(m_data[1]) && agx::equalsZero(m_data[2]) && agx::equalsZero(m_data[3]));
419 inline void Vec4::set(
double x,
double y,
double z,
double w )
430 m_data[0] = m_data[1] = m_data[2] = m_data[3] = value;
436 m_data[0] = rhs.m_data[0];
437 m_data[1] = rhs.m_data[1];
438 m_data[2] = rhs.m_data[2];
439 m_data[3] = rhs.m_data[3];
510 return agx::isNaN( m_data[0] ) || agx::isNaN( m_data[1] ) || agx::isNaN( m_data[2] ) || agx::isNaN( m_data[3] );
516 return agx::isFinite( m_data[0] ) && agx::isFinite( m_data[1] ) && agx::isFinite( m_data[2] ) && agx::isFinite( m_data[3] );
522 return m_data[0] * rhs.m_data[0] + m_data[1] * rhs.m_data[1] + m_data[2] * rhs.m_data[2] + m_data[3] * rhs.m_data[3];
528 return Vec4( m_data[0] * rhs.m_data[0],
529 m_data[1] * rhs.m_data[1],
530 m_data[2] * rhs.m_data[2],
531 m_data[3] * rhs.m_data[3] );
537 return Vec4( m_data[0] * rhs, m_data[1] * rhs, m_data[2] * rhs, m_data[3] * rhs );
544 m_data[0] = m_data[0] * rhs;
545 m_data[1] = m_data[1] * rhs;
546 m_data[2] = m_data[2] * rhs;
547 m_data[3] = m_data[3] * rhs;
554 return Vec4( m_data[0] / rhs, m_data[1] / rhs, m_data[2] / rhs, m_data[3] / rhs );
560 m_data[0] = m_data[0] / rhs;
561 m_data[1] = m_data[1] / rhs;
562 m_data[2] = m_data[2] / rhs;
563 m_data[3] = m_data[3] / rhs;
571 return Vec4( m_data[0] + rhs.m_data[0], m_data[1] + rhs.m_data[1], m_data[2] + rhs.m_data[2], m_data[3] + rhs.m_data[3] );
577 m_data[0] += rhs.m_data[0];
578 m_data[1] += rhs.m_data[1];
579 m_data[2] += rhs.m_data[2];
580 m_data[3] += rhs.m_data[3];
587 return Vec4( m_data[0] - rhs.m_data[0], m_data[1] - rhs.m_data[1], m_data[2] - rhs.m_data[2], m_data[3] - rhs.m_data[3] );
593 m_data[0] -= rhs.m_data[0];
594 m_data[1] -= rhs.m_data[1];
595 m_data[2] -= rhs.m_data[2];
596 m_data[3] -= rhs.m_data[3];
603 return Vec4( m_data[0] + rhs, m_data[1] + rhs, m_data[2] + rhs, m_data[3] + rhs );
619 return Vec4( m_data[0] - rhs, m_data[1] - rhs, m_data[2] - rhs, m_data[3] - rhs );
635 return Vec4 ( -m_data[0], -m_data[1], -m_data[2], -m_data[3] );
647 return double(m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2] + m_data[3] * m_data[3]);
662 double inv = 1.0 / norm;
663 m_data[0] = double(m_data[0] * inv);
664 m_data[1] = double(m_data[1] * inv);
665 m_data[2] = double(m_data[2] * inv);
666 m_data[3] = double(m_data[3] * inv);
676 return Vec3( m_data[0], m_data[1], m_data[2] );
694 output << v[0] <<
" " << v[1] <<
" " << v[2] <<
" " << v[3];
699 inline std::string Vec4::__str__()
const
701 std::ostringstream stream;
710 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + rhs[3];
716 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + lhs[3];
721 Vec4 diff(m_data[0] - v2.m_data[0], m_data[1] - v2.m_data[1], m_data[2] - v2.m_data[2], m_data[3] - v2.m_data[3]);
729 return agx::equivalent(a[0], b[0], epsilon) &&
730 agx::equivalent(a[1], b[1], epsilon) &&
731 agx::equivalent(a[2], b[2], epsilon) &&
732 agx::equivalent(a[3], b[3], epsilon);
738 return Vec4(std::abs(a[0]),
748 result.
clamp(minimum, maximum);
A 3 dimensional vector which can be used to define a point or a vector and contains basic arithmetic.
Definition: Vec3.h:40
A 4 dimensional vector and contains basic arithmetic.
Definition: Vec4.h:33
void setY(double value)
Definition: Vec4.h:484
double distance2(const Vec4 &v2) const
Definition: Vec4.h:719
bool isNaN() const
Definition: Vec4.h:508
double Type
Definition: Vec4.h:35
void setX(double value)
Definition: Vec4.h:478
Vec4 & operator-=(const Vec4 &rhs)
Unary vector subtract.
Definition: Vec4.h:591
const Vec4 operator|(const Vec4 &rhs) const
Definition: Vec4.h:526
const Vec4 operator/(double rhs) const
Divide by scalar.
Definition: Vec4.h:552
Vec4()
Default constructor.
Definition: Vec4.h:291
static Vec4 componentMax(const Vec4 &v1, const Vec4 &v2)
Definition: Vec4.h:353
double minComponent() const
Definition: Vec4.h:359
Vec3 asVec3() const
Definition: Vec4.h:674
const Vec4 operator-() const
Negation operator.
Definition: Vec4.h:633
double z() const
Definition: Vec4.h:466
int maxElement() const
Definition: Vec4.h:386
void set(double x, double y, double z, double w)
Set the elements of the vector.
Definition: Vec4.h:419
bool operator==(const Vec4 &v) const
Equality test.
Definition: Vec4.h:334
Vec4 & operator/=(double rhs)
Definition: Vec4.h:558
void clamp(const Vec4 &min, const Vec4 &max)
Clamp a vector between a lower and upper bound (per component).
Definition: Vec4.h:401
int minElement() const
Definition: Vec4.h:371
double maxComponent() const
Definition: Vec4.h:365
bool equalsZero() const
Definition: Vec4.h:411
Vec4 & operator+=(const Vec4 &rhs)
Unary vector add.
Definition: Vec4.h:575
void setZ(double value)
Definition: Vec4.h:490
bool operator!=(const Vec4 &v) const
In-equality test.
Definition: Vec4.h:340
double w() const
Definition: Vec4.h:472
bool isFinite() const
Definition: Vec4.h:514
double y() const
Definition: Vec4.h:461
bool isValid() const
Definition: Vec4.h:502
void setW(double value)
Definition: Vec4.h:496
double length() const
Definition: Vec4.h:639
static Vec4 componentMin(const Vec4 &v1, const Vec4 &v2)
Definition: Vec4.h:347
double normalize()
Normalize the vector so that it has length unity.
Definition: Vec4.h:658
static Vec4 random(double min, double max)
Definition: Vec4.h:680
double x() const
Definition: Vec4.h:455
const Vec4 operator+(const Vec4 &rhs) const
Binary vector add.
Definition: Vec4.h:569
double & operator[](int i)
Definition: Vec4.h:443
Vec4 & operator*=(double rhs)
Definition: Vec4.h:542
double operator*(const Vec4 &rhs) const
Definition: Vec4.h:520
double length2() const
Definition: Vec4.h:645
double distance(const Vec4 &v2) const
Definition: Vec4.h:652
Namespace for Momentum Scripting API.
Definition: AffineMatrix4x4.h:29
const double MOMENTUM_EQUIVALENT_EPSILON
Definition: momentum_math.h:30
std::ostream & operator<<(std::ostream &os, const EulerAngles &e)
Definition: EulerAngles.h:358
Vec3 max(const Vec3 &lhs, const Vec3 &rhs)
Definition: Vec3.h:804
Vec3 operator*(const Vec3 &v, const Matrix3x3 &m)
Definition: Matrix3x3.h:746
Vec3 min(const Vec3 &lhs, const Vec3 &rhs)
Definition: Vec3.h:810
Vec3 absolute(const Vec3 &a)
Definition: Vec3.h:775
Vec3 clamp(const Vec3 &vec, const Vec3 &minimum, const Vec3 &maximum)
Definition: Vec3.h:841
bool equivalent(const Matrix3x3 &a, const Matrix3x3 &b, double epsilon=1e-6)
Definition: Matrix3x3.h:905
Definition: Statistic.h:23