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;}
220 {
CoordType themag =
mag();
return (*
this *= norm / themag);}
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);}
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);
458 return Equal(dot * dot, v1.sqrMag() * v2.sqrMag());
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