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>
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);
146 Vector& operator=(
const 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;}
162 friend Vector&
operator+=<dim>(Vector& v1,
const Vector& v2);
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);
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;}
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);}
369 inline Vector<3>& Vector<3>::mirrorZ()
377 Vector<3>
Cross(
const Vector<3>& v1,
const Vector<3>& v2);
386 bool Parallel(
const Vector<dim>& v1,
const Vector<dim>& v2,
bool& same_dir);
393 bool Parallel(
const Vector<dim>& v1,
const Vector<dim>& v2);
397 bool Perpendicular(
const Vector<dim>& v1,
const Vector<dim>& v2);
400 inline Vector<dim> operator+(
const Vector<dim>& v1,
const Vector<dim>& v2)
410 inline Vector<dim> operator-(
const Vector<dim>& v1,
const Vector<dim>& v2)
420 inline Vector<dim>
operator*(
const Vector<dim>& v, CoordType d)
430 inline Vector<dim>
operator*(CoordType d,
const Vector<dim>& v)
440 inline Vector<dim> operator/(
const Vector<dim>& v, CoordType d)
456 same_dir = (dot > 0);
470 inline CoordType Vector<1>::sloppyMagMax()
476 inline CoordType Vector<2>::sloppyMagMax()
478 return 1.082392200292393968799446410733f;
482 inline CoordType Vector<3>::sloppyMagMax()
484 return 1.145934719303161490541433900265f;
488 inline CoordType Vector<1>::sloppyMagMaxSqrt()
494 inline CoordType Vector<2>::sloppyMagMaxSqrt()
496 return 1.040380795811030899095785063701f;
500 inline CoordType Vector<3>::sloppyMagMaxSqrt()
502 return 1.070483404496847625250328653179f;
507 #endif // WFMATH_VECTOR_H