15#ifndef MOMENTUM_VEC3_H
16#define MOMENTUM_VEC3_H
18#include "momentum_namespace.h"
19#include "momentum_export.h"
22#include <agx/PushDisableWarnings.h>
24#include <agx/PopDisableWarnings.h>
29#include "momentum_math.h"
47 operator agx::Vec3()
const {
return agx::Vec3(
x(),
y(),
z()); }
48 operator agx::Vec3f()
const {
return agx::Vec3f((agx::Real32)
x(), (agx::Real32)
y(), (agx::Real32)
z()); }
50 Vec3(
const agx::Vec3& copy)
52 set(copy.x(), copy.y(), copy.z());
55 Vec3(
const agx::Vec3f& copy)
57 set(copy.x(), copy.y(), copy.z());
70 Vec3(
const Vec3& copy,
double value,
int i);
93 explicit Vec3(
double r );
96 Vec3(
double x,
double y,
double z );
98 explicit Vec3(
const double v[3] );
151 void set(
double x,
double y,
double z );
154 void set(
double value );
176 void setX(
double value );
179 void setY(
double value);
182 void setZ(
double value);
296 std::string __str__()
const;
311 m_data[ 0 ] = copy.m_data[ 0 ];
312 m_data[ 1 ] = copy.m_data[ 1 ];
313 m_data[ 2 ] = copy.m_data[ 2 ];
314 m_data[ 3 ] = double(0);
320 m_data[0] = copy.m_data[0];
321 m_data[1] = copy.m_data[1];
322 m_data[2] = copy.m_data[2];
323 m_data[3] = double(0);
331 m_data[0] = copy.m_data[0];
332 m_data[1] = copy.m_data[1];
333 m_data[2] = copy.m_data[2];
334 m_data[3] = double(0);
342 m_data[0] = double();
343 m_data[1] = double();
344 m_data[2] = double();
345 m_data[3] = double(0);
351 m_data[0] = m_data[1] = m_data[2] = r;
352 m_data[3] = double(0);
361 m_data[3] = double(0);
370 m_data[3] = double(0);
377 return m_data[0] == v.m_data[0] && m_data[1] == v.m_data[1] && m_data[2] == v.m_data[2];
383 return m_data[0] != v.m_data[0] || m_data[1] != v.m_data[1] || m_data[2] != v.m_data[2];
390 return Vec3( std::min(
v1[0], v2[0] ), std::min(
v1[1], v2[1] ), std::min(
v1[2], v2[2] ) );
396 return Vec3( std::max(
v1[0], v2[0] ), std::max(
v1[1], v2[1] ), std::max(
v1[2], v2[2] ) );
402 return std::min(std::min(m_data[0], m_data[1]), m_data[2]);
408 return std::max(std::max(m_data[0], m_data[1]), m_data[2]);
414 double m = std::numeric_limits<double>::infinity();
416 for(
int i = 0; i < 3; i++) {
417 double a = agx::absolute(m_data[i]);
431 for(
int i = 0; i < 3; i++) {
432 double a = agx::absolute(m_data[i]);
444 m_data[0] = agx::clamp( m_data[0],
min.m_data[0],
max.m_data[0] );
445 m_data[1] = agx::clamp( m_data[1],
min.m_data[1],
max.m_data[1] );
446 m_data[2] = agx::clamp( m_data[2],
min.m_data[2],
max.m_data[2] );
452 return (agx::equalsZero(m_data[0]) && agx::equalsZero(m_data[1]) && agx::equalsZero(m_data[2]));
467 m_data[0] = m_data[1] = m_data[2] = value;
473 m_data[0] = rhs.m_data[0];
474 m_data[1] = rhs.m_data[1];
475 m_data[2] = rhs.m_data[2];
535 return agx::isNaN( m_data[0] ) || agx::isNaN( m_data[1] ) || agx::isNaN( m_data[2] );
541 return agx::isFinite( m_data[0] ) && agx::isFinite( m_data[1] ) && agx::isFinite( m_data[2] );
547 return double(m_data[0] * rhs.m_data[0] + m_data[1] * rhs.m_data[1] + m_data[2] * rhs.m_data[2]);
553 return Vec3( m_data[1] * rhs.m_data[2] - m_data[2] * rhs.m_data[1],
554 m_data[2] * rhs.m_data[0] - m_data[0] * rhs.m_data[2] ,
555 m_data[0] * rhs.m_data[1] - m_data[1] * rhs.m_data[0] );
561 return Vec3(m_data[1] * rhs.m_data[2] - m_data[2] * rhs.m_data[1],
562 m_data[2] * rhs.m_data[0] - m_data[0] * rhs.m_data[2],
563 m_data[0] * rhs.m_data[1] - m_data[1] * rhs.m_data[0]);
568 {
return Vec3( lhs[0] * rhs[0],
576 return Vec3( lhs[0] / rhs[0],
585 return Vec3(
double(m_data[0] * rhs),
double(m_data[1] * rhs),
double(m_data[2] * rhs) );
592 m_data[0] = double(m_data[0] * rhs);
593 m_data[1] = double(m_data[1] * rhs);
594 m_data[2] = double(m_data[2] * rhs);
601 return Vec3(
double(m_data[0] / rhs),
double(m_data[1] / rhs),
double(m_data[2] / rhs) );
607 m_data[0] = double(m_data[0] / rhs);
608 m_data[1] = double(m_data[1] / rhs);
609 m_data[2] = double(m_data[2] / rhs);
617 return Vec3( m_data[0] + rhs[0], m_data[1] + rhs[1], m_data[2] + rhs[2] );
623 m_data[0] += rhs.m_data[0];
624 m_data[1] += rhs.m_data[1];
625 m_data[2] += rhs.m_data[2];
632 return Vec3( m_data[0] - rhs[0], m_data[1] - rhs[1], m_data[2] - rhs[2] );
638 m_data[0] -= rhs.m_data[0];
639 m_data[1] -= rhs.m_data[1];
640 m_data[2] -= rhs.m_data[2];
647 return Vec3( m_data[0] + rhs, m_data[1] + rhs, m_data[2] + rhs );
662 return Vec3( m_data[0] - rhs, m_data[1] - rhs, m_data[2] - rhs );
677 return Vec3 ( -m_data[0], -m_data[1], -m_data[2] );
683 return std::sqrt( (m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2]) );
689 return m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2];
709 double inv = newLength / norm;
710 m_data[0] = double(m_data[0] * inv);
711 m_data[1] = double(m_data[1] * inv);
712 m_data[2] = double(m_data[2] * inv);
730 return Vec3(1, 0, 0);
736 return Vec3(0, 1, 0);
742 return Vec3(0, 0, 1);
769 return agx::equivalent(a[0], b[0], epsilon) &&
770 agx::equivalent(a[1], b[1], epsilon) &&
771 agx::equivalent(a[2], b[2], epsilon);
777 return Vec3(std::abs(a[0]),
785 return Vec3(std::asin(a[0]),
793 return Vec3(agx::sinc(a[0]),
820 output << v[0] <<
" " << v[1] <<
" " << v[2];
825 inline std::string Vec3::__str__()
const
827 std::ostringstream stream;
835 Vec3 diff(m_data[0] - v2.m_data[0], m_data[1] - v2.m_data[1], m_data[2] - v2.m_data[2]);
844 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
Vec3 & operator+=(const Vec3 &rhs)
Unary vector add.
Definition: Vec3.h:621
double normalize()
Normalize the vector so that it has length unity.
Definition: Vec3.h:699
const Vec3 operator-() const
Negation operator.
Definition: Vec3.h:675
void setY(double value)
set the y element of this vector
Definition: Vec3.h:515
double length2() const
Definition: Vec3.h:687
const Vec3 operator+(const Vec3 &rhs) const
Binary vector add.
Definition: Vec3.h:615
double setLength(double l)
Scale the vector so that is has the specified length.
Definition: Vec3.h:704
double minComponent() const
Definition: Vec3.h:400
bool isNaN() const
Definition: Vec3.h:533
static Vec3 div(const Vec3 &lhs, const Vec3 &rhs)
Element-wise-division.
Definition: Vec3.h:574
double distance2(const Vec3 &v2) const
Definition: Vec3.h:833
bool isFinite() const
Definition: Vec3.h:539
double y() const
Definition: Vec3.h:497
void set(double x, double y, double z)
Set the value of this vector with the specified elements.
Definition: Vec3.h:457
Vec3 normal() const
Definition: Vec3.h:719
static Vec3 componentMin(const Vec3 &v1, const Vec3 &v2)
Creates a new vector where each component is the minimum of this and the other vector.
Definition: Vec3.h:388
Vec3 & operator-=(const Vec3 &rhs)
Unary vector subtract.
Definition: Vec3.h:636
int minElement() const
Definition: Vec3.h:412
double distance(const Vec3 &v2) const
Definition: Vec3.h:693
Vec3()
Default constructor.
Definition: Vec3.h:340
double Type
Definition: Vec3.h:42
const Vec3 operator/(double rhs) const
Divide by scalar.
Definition: Vec3.h:599
void setX(double value)
set the x element of this vector
Definition: Vec3.h:509
bool isValid() const
Definition: Vec3.h:527
double maxComponent() const
Definition: Vec3.h:406
bool equalsZero() const
Definition: Vec3.h:450
Vec3 & operator/=(double rhs)
Unary divide by scalar.
Definition: Vec3.h:605
bool operator==(const Vec3 &v) const
Equality test.
Definition: Vec3.h:375
double length() const
Definition: Vec3.h:681
void clamp(const Vec3 &min, const Vec3 &max)
Clamp a vector between a lower and upper bound (per component).
Definition: Vec3.h:442
const Vec3 operator^(const Vec3 &rhs) const
Definition: Vec3.h:551
int maxElement() const
Definition: Vec3.h:427
double & operator[](int i)
\access the ith element of this vector
Definition: Vec3.h:479
static Vec3 X_AXIS()
Definition: Vec3.h:728
bool operator!=(const Vec3 &v) const
In-equality test.
Definition: Vec3.h:381
Vec3 & operator*=(double rhs)
Unary multiply by scalar.
Definition: Vec3.h:590
void setZ(double value)
set the z element of this vector
Definition: Vec3.h:521
static Vec3 random(double min=double(0), double max=double(1))
Definition: Vec3.h:754
double z() const
Definition: Vec3.h:503
static Vec3 Y_AXIS()
Definition: Vec3.h:734
static Vec3 Z_AXIS()
Definition: Vec3.h:740
static Vec3 mul(const Vec3 &lhs, const Vec3 &rhs)
Element-wise-multiplication.
Definition: Vec3.h:567
static Vec3 componentMax(const Vec3 &v1, const Vec3 &v2)
Creates a new vector where each component is the maximum of this and the other vector.
Definition: Vec3.h:394
static Vec3 AXIS(int i)
Definition: Vec3.h:746
double x() const
Definition: Vec3.h:491
const Vec3 cross(const Vec3 &rhs) const
Definition: Vec3.h:559
double operator*(const Vec3 &rhs) const
Definition: Vec3.h:545
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 asin(const Vec3 &a)
Definition: Vec3.h:783
Vec3 absolute(const Vec3 &a)
Definition: Vec3.h:775
Vec3 clamp(const Vec3 &vec, const Vec3 &minimum, const Vec3 &maximum)
Definition: Vec3.h:841
Vec3 sinc(const Vec3 &a)
Definition: Vec3.h:791
bool equivalent(const Matrix3x3 &a, const Matrix3x3 &b, double epsilon=1e-6)
Definition: Matrix3x3.h:905
Definition: Statistic.h:23