30 #ifndef WFMATH_VECTOR_H 31 #define WFMATH_VECTOR_H 33 #include <wfmath/const.h> 42 Vector<dim>& operator+=(Vector<dim>& v1,
const Vector<dim>& v2);
44 Vector<dim>& operator-=(Vector<dim>& v1,
const Vector<dim>& v2);
46 Vector<dim>& operator*=(Vector<dim>& v,
CoordType d);
48 Vector<dim>& operator/=(Vector<dim>& v,
CoordType d);
51 Vector<dim> operator+(
const Vector<dim>& v1,
const Vector<dim>& v2);
53 Vector<dim> operator-(
const Vector<dim>& v1,
const Vector<dim>& v2);
55 Vector<dim> operator-(
const Vector<dim>& v);
61 Vector<dim> operator/(
const Vector<dim>& v,
CoordType d);
64 CoordType Dot(
const Vector<dim>& v1,
const Vector<dim>& v2);
67 CoordType Angle(
const Vector<dim>& v,
const Vector<dim>& u);
72 Vector<dim>
Prod(
const RotMatrix<dim>& m,
const Vector<dim>& v);
75 Vector<dim>
InvProd(
const RotMatrix<dim>& m,
const Vector<dim>& v);
81 Vector<dim>
Prod(
const Vector<dim>& v,
const RotMatrix<dim>& m);
84 Vector<dim>
ProdInv(
const Vector<dim>& v,
const RotMatrix<dim>& m);
88 Vector<dim>
operator*(
const RotMatrix<dim>& m,
const Vector<dim>& v);
91 Vector<dim>
operator*(
const Vector<dim>& v,
const RotMatrix<dim>& m);
94 Vector<dim> operator-(
const Point<dim>& c1,
const Point<dim>& c2);
96 Point<dim> operator+(
const Point<dim>& c,
const Vector<dim>& v);
98 Point<dim> operator-(
const Point<dim>& c,
const Vector<dim>& v);
100 Point<dim> operator+(
const Vector<dim>& v,
const Point<dim>& c);
103 Point<dim>& operator+=(Point<dim>& p,
const Vector<dim>& v);
105 Point<dim>& operator-=(Point<dim>& p,
const Vector<dim>& v);
108 std::ostream& operator<<(std::ostream& os, const Vector<dim>& v);
110 std::istream& operator>>(std::istream& is, Vector<dim>& v);
112 template<
typename Shape>
120 template<
int dim = 3>
122 friend class ZeroPrimitive<
Vector<dim> >;
129 explicit Vector(
const AtlasInType& a);
138 friend std::ostream& operator<< <dim>(std::ostream& os,
const Vector& v);
139 friend std::istream&
operator>> <dim>(std::istream& is,
Vector& v);
148 bool isEqualTo(
const Vector& v,
CoordType epsilon = numeric_constants<CoordType>::epsilon())
const;
149 bool operator==(
const Vector& v)
const {
return isEqualTo(v);}
150 bool operator!=(
const Vector& v)
const {
return !isEqualTo(v);}
152 bool isValid()
const {
return m_valid;}
154 void setValid(
bool valid =
true) {m_valid = valid;}
164 friend Vector&
operator-=<dim>(Vector& v1,
const Vector& v2);
166 friend Vector&
operator*=<dim>(Vector& v,
CoordType d);
168 friend Vector&
operator/=<dim>(Vector& v,
CoordType d);
171 friend Vector
operator+<dim>(
const Vector& v1,
const Vector& v2);
173 friend Vector
operator-<dim>(
const Vector& v1,
const Vector& v2);
175 friend Vector
operator-<dim>(
const Vector& v);
177 friend Vector
operator*<dim>(
CoordType d,
const Vector& v);
179 friend Vector
operator*<dim>(
const Vector& v,
CoordType d);
181 friend Vector
operator/<dim>(
const Vector& v,
CoordType d);
184 friend Vector Prod<dim>(
const RotMatrix<dim>& m,
const Vector& v);
185 friend Vector InvProd<dim>(
const RotMatrix<dim>& m,
const Vector& v);
202 friend Point<dim>&
operator+=<dim>(Point<dim>& p,
const Vector& rhs);
204 friend Point<dim>&
operator-=<dim>(Point<dim>& p,
const Vector& rhs);
210 friend CoordType Dot<dim>(
const Vector& v1,
const Vector& v2);
212 friend CoordType Angle<dim>(
const Vector& v,
const Vector& u);
220 {
CoordType themag =
mag();
return (*
this *= norm / themag);}
271 Vector&
mirror(
const int i) { m_elem[i] *= -1;
return *
this;}
274 {
return operator-=(*
this, 2 * v *
Dot(v, *
this) / v.sqrMag());}
346 const CoordType* elements()
const {
return m_elem;}
349 double _scaleEpsilon(
const Vector& v,
CoordType epsilon = numeric_constants<CoordType>::epsilon())
const 350 {
return _ScaleEpsilon(m_elem, v.m_elem, dim, epsilon);}
456 same_dir = (dot > 0);
458 return Equal(dot * dot, v1.sqrMag() * v2.sqrMag());
478 return 1.082392200292393968799446410733f;
484 return 1.145934719303161490541433900265f;
496 return 1.040380795811030899095785063701f;
502 return 1.070483404496847625250328653179f;
507 #endif // WFMATH_VECTOR_H Vector()
Construct an uninitialized vector.
Definition: vector.h:125
bool Equal(const C &c1, const C &c2, CoordType epsilon=numeric_constants< CoordType >::epsilon())
Test for equality up to precision epsilon.
Definition: const.h:158
Generic library namespace.
Definition: atlasconv.h:45
Vector & mirror(const int i)
Reflect a vector in the direction of the i'th axis.
Definition: vector.h:271
static const Vector< dim > & ZERO()
Provides a global instance preset to zero.
Definition: vector_funcs.h:62
Vector & rotateZ(CoordType theta)
3D only: rotate a vector about the z axis by an angle theta
CoordType y() const
Access the second component of a vector.
Definition: vector.h:317
Vector & polar(CoordType r, CoordType theta)
2D only: construct a vector from polar coordinates
CoordType z() const
Access the third component of a vector.
void asSpherical(CoordType &r, CoordType &theta, CoordType &phi) const
3D only: convert a vector to shperical coordinates
Vector & mirror()
Reflect a vector in all directions simultaneously.
Definition: vector.h:279
A dim dimensional rotation matrix. Technically, a member of the group O(dim).
Definition: const.h:53
Vector & rotateY(CoordType theta)
3D only: rotate a vector about the y axis by an angle theta
Vector & mirrorY()
Flip the y component of a vector.
Definition: vector.h:328
Vector & mirror(const Vector &v)
Reflect a vector in the direction specified by v.
Definition: vector.h:273
friend Vector operator/(const Vector &v, CoordType d)
Divide a vector by a scalar.
Definition: vector.h:440
CoordType sqrMag() const
The squared magnitude of a vector.
Definition: vector_funcs.h:237
Vector & rotate(int axis1, int axis2, CoordType theta)
Rotate the vector in the (axis1, axis2) plane by the angle theta.
Definition: vector_funcs.h:191
Vector & rotateX(CoordType theta)
3D only: rotate a vector about the x axis by an angle theta
bool Perpendicular(const Vector< dim > &v1, const Vector< dim > &v2)
Check if two vectors are perpendicular.
Definition: vector_funcs.h:250
RotMatrix< dim > InvProd(const RotMatrix< dim > &m1, const RotMatrix< dim > &m2)
returns m1^-1 * m2
Definition: rotmatrix_funcs.h:133
Vector & mirrorX()
Flip the x component of a vector.
Definition: vector.h:326
Vector & spherical(CoordType r, CoordType theta, CoordType phi)
3D only: construct a vector from shperical coordinates
void setValid(bool valid=true)
make isValid() return true if you've initialized the vector by hand
Definition: vector.h:154
friend Vector operator*(CoordType d, const Vector &v)
Multiply a vector by a scalar.
Definition: vector.h:430
Vector & sloppyNorm(CoordType norm=1.0)
Approximately normalize a vector.
Definition: vector_funcs.h:155
CoordType & y()
Access the second component of a vector.
Definition: vector.h:319
void asPolar(CoordType &r, CoordType &theta) const
2D only: convert a vector to polar coordinates
A dim dimensional vector.
Definition: const.h:55
CoordType & x()
Access the first component of a vector.
Definition: vector.h:315
Vector & zero()
Zero the components of a vector.
Definition: vector_funcs.h:165
float CoordType
Basic floating point type.
Definition: const.h:140
friend CoordType Dot(const Vector &v1, const Vector &v2)
The dot product of two vectors.
Definition: vector_funcs.h:223
friend CoordType Cross(const Vector< 2 > &v1, const Vector< 2 > &v2)
2D only: get the z component of the cross product of two vectors
CoordType sloppyMag() const
An approximation to the magnitude of a vector.
static CoordType sloppyMagMaxSqrt()
The square root of sloppyMagMax()
friend Vector operator-(const Vector &v1, const Vector &v2)
Take the difference of two vectors.
Definition: vector.h:410
AtlasOutType toAtlas() const
Create an Atlas object from the vector.
Definition: atlasconv.h:116
Vector & normalize(CoordType norm=1.0)
Normalize a vector.
Definition: vector.h:219
friend Vector & operator-=(Vector &v1, const Vector &v2)
Subtract the second vector from the first.
Definition: vector_funcs.h:108
CoordType mag() const
The magnitude of a vector.
Definition: vector.h:217
static CoordType sloppyMagMax()
The maximum ratio of the return value of sloppyMag() to the true magnitude.
CoordType x() const
Access the first component of a vector.
Definition: vector.h:313
RotMatrix< dim > operator*(const RotMatrix< dim > &m1, const RotMatrix< dim > &m2)
returns m1 * m2
Definition: rotmatrix_funcs.h:223
friend Vector & operator*=(Vector &v, CoordType d)
Multiply the magnitude of v by d.
Definition: vector_funcs.h:120
CoordType & operator[](const int i)
Get the i'th element of the vector.
Definition: vector.h:190
Vector & mirrorZ()
Flip the z component of a vector.
void fromAtlas(const AtlasInType &a)
Set the vector's value to that given by an Atlas object.
Definition: atlasconv.h:109
CoordType operator[](const int i) const
Get the i'th element of the vector.
Definition: vector.h:188
RotMatrix< dim > ProdInv(const RotMatrix< dim > &m1, const RotMatrix< dim > &m2)
returns m1 * m2^-1
Definition: rotmatrix_funcs.h:111
A normalized quaterion.
Definition: quaternion.h:35
RotMatrix< dim > Prod(const RotMatrix< dim > &m1, const RotMatrix< dim > &m2)
returns m1 * m2
Definition: rotmatrix_funcs.h:89
A dim dimensional point.
Definition: const.h:50
bool Parallel(const Vector< dim > &v1, const Vector< dim > &v2, bool &same_dir)
Check if two vectors are parallel.
Definition: vector.h:450
friend Vector operator+(const Vector &v1, const Vector &v2)
Take the sum of two vectors.
Definition: vector.h:400