1#ifndef __GfxTL_VECTORXD_HEADER__
2#define __GfxTL_VECTORXD_HEADER__
4#ifndef _USE_MATH_DEFINES
5#define _USE_MATH_DEFINES
19 template <
unsigned int D,
class T>
49 for (
unsigned int i = 0; i <
Dim; ++i)
58 for (
unsigned int i = 0; i <
Dim; ++i)
70 for (
unsigned int i = 0; i <
Dim; ++i)
78 typename std::enable_if<std::is_convertible<S, ScalarType>::value,
81 for (
unsigned int i = 0; i <
Dim; ++i)
87 template <
unsigned int X>
90 for (
unsigned int i = 0; i < std::min(D, X); ++i)
94 for (
unsigned int i = X; i < D; ++i)
102 for (
unsigned int i = 0; i < D - 1; ++i)
111 for (
unsigned int i = 0; i < D - 2; ++i)
121 for (
unsigned int i = 0; i < D - 2; ++i)
176 for (
unsigned int i = 0; i < D; ++i)
208 for (
unsigned int i = 0; i < D; ++i)
218 for (
unsigned int i = 0; i < D; ++i)
229 for (
unsigned int i = 0; i < D; ++i)
240 for (
unsigned int i = 0; i < D; ++i)
263 for (
unsigned int i = 0; i < D; ++i)
274 for (
unsigned int i = 0; i < D; ++i)
299 for (
unsigned int i = 1; i <
Dim; ++i)
317 for (
unsigned int i = 1; i <
Dim; ++i)
328 for (
unsigned int i = 1; i <
Dim; ++i)
343 for (
unsigned int i = 0; i <
Dim; ++i)
379 template <
unsigned int D,
class T>
384 for (
unsigned int i = 0; i < D; ++i)
396 template <
unsigned int D,
class T>
397 inline const VectorXD<D, T>
401 for (
unsigned int i = 0; i < D; ++i)
409 inline const VectorXD<1, T>
416 inline const VectorXD<2, T>
423 inline const VectorXD<3, T>
430 inline const VectorXD<4, T>
433 return VectorXD<4, T>(a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3]);
436 template <
unsigned int D,
class T>
437 inline const VectorXD<D, T>
441 for (
unsigned int i = 0; i < D; ++i)
449 inline const VectorXD<1, T>
456 inline const VectorXD<2, T>
463 inline const VectorXD<3, T>
470 inline const VectorXD<4, T>
473 return VectorXD<4, T>(a[0] - b[0], a[1] - b[1], a[2] - b[2], a[3] - b[3]);
477 template <
unsigned int D,
class T>
482 for (
unsigned int i = 1; i < D; ++i)
484 retVal += a[i] * b[i];
490 template <
unsigned int A,
unsigned int B,
class T>
491 inline MatrixXX<B, A, T>
495 for (
unsigned int c = 0;
c < B; ++
c)
496 for (
unsigned int r = 0; r <
A; ++r)
498 m[
c][r] = a[r] * b[
c];
503 template <
unsigned int D,
class T>
504 inline MatrixXX<D, D, T>
508 for (
unsigned int c = 0;
c < D; ++
c)
510 m[
c][
c] = a[
c] * a[
c];
511 for (
unsigned int r =
c + 1; r < D; ++r)
513 m[
c][r] = a[r] * a[
c];
531 return a[0] * b[0] + a[1] * b[1];
538 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
542 inline typename VectorXD<4, T>::ScalarType
545 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
548 template <
unsigned int D,
class T>
549 inline VectorXD<D, T>
553 for (
unsigned int i = 0; i < D; ++i)
561 inline const VectorXD<1, T>
568 inline const VectorXD<2, T>
575 inline const VectorXD<3, T>
582 inline const VectorXD<4, T>
588 template <
unsigned int D,
class T>
589 inline VectorXD<D, T>
593 for (
unsigned int i = 0; i < D; ++i)
601 inline const VectorXD<1, T>
608 inline const VectorXD<2, T>
615 inline const VectorXD<3, T>
622 inline const VectorXD<4, T>
628 template <
unsigned int D,
class T>
629 inline VectorXD<D, T>
633 for (
unsigned int i = 0; i < D; ++i)
641 inline const VectorXD<1, T>
648 inline const VectorXD<2, T>
655 inline const VectorXD<3, T>
662 inline const VectorXD<4, T>
669 inline const VectorXD<3, T>
673 a[1] * b[2] - b[1] * a[2], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]);
676 template <
unsigned int D,
class T>
677 inline VectorXD<D, T>
682 for (
unsigned int r = 0; r < D; ++r)
684 m[r] =
min(a[r], b[r]);
689 template <
unsigned int D,
class T>
690 inline VectorXD<D, T>
695 for (
unsigned int r = 0; r < D; ++r)
697 m[r] =
max(a[r], b[r]);
702 template <
unsigned int D,
class T>
703 inline VectorXD<D, T>
707 for (
unsigned int i = 0; i < D; ++i)
774 T rad = (deg * (
T)
M_PI / (
T)180.0) / (
T)2.0;
775 (*this)[0] = std::cos(rad);
786 (*this)[0] = std::cos(rad / 2);
787 T s = std::sin(rad / 2);
798 Rotation(deg, a[0] / l, a[1] / l, a[2] / l);
804 *deg = ((
T)std::acos((*
this)[0]) * (
T)2.0) * (
T)180.0 / (
T)
M_PI;
805 T sinA = (
T)std::sqrt(1.0 - (*
this)[0] * (*
this)[0]);
806 T absSin = sinA < 0 ? -sinA : sinA;
807 if (absSin < (
T)0.00005)
811 *a0 = (*this)[1] / sinA;
812 *a1 = (*this)[2] / sinA;
813 *a2 = (*this)[3] / sinA;
819 *rad = ((
T)std::acos((*
this)[0]) * (
T)2.0);
820 T sinA = (
T)std::sqrt(1.0 - (*
this)[0] * (*
this)[0]);
821 T absSin = sinA < 0 ? -sinA : sinA;
822 if (absSin < (
T)0.00005)
826 *a0 = (*this)[1] / sinA;
827 *a1 = (*this)[2] / sinA;
828 *a2 = (*this)[3] / sinA;
834 Rotation(deg, &(*axis)[0], &(*axis)[1], &(*axis)[2]);
851 return Quaternion<T>((*
this)[0], -(*
this)[1], -(*
this)[2], -(*
this)[3]);
859 for (
unsigned int i = 0; i < 4; ++i)
875 T xy =
q[1] *
q[2] * 2;
876 T zw =
q[0] *
q[3] * 2;
877 T xz =
q[1] *
q[3] * 2;
878 T xw =
q[1] *
q[0] * 2;
879 T yw =
q[0] *
q[2] * 2;
880 T yz =
q[2] *
q[3] * 2;
882 (*mat)[0][0] = ww + xx - yy - zz;
883 (*mat)[0][1] = xy + zw;
884 (*mat)[0][2] = xz - yw;
886 (*mat)[1][0] = xy - zw;
887 (*mat)[1][1] = ww - xx + yy - zz;
888 (*mat)[1][2] = yz + xw;
890 (*mat)[2][0] = xz + yw;
891 (*mat)[2][1] = yz - xw;
892 (*mat)[2][2] = ww - xx - yy + zz;
912 return Quaternion<T>(a[0] * b[0] - a[1] * b[1] - a[2] * b[2] - a[3] * b[3],
913 a[0] * b[1] + a[1] * b[0] + a[2] * b[3] - a[3] * b[2],
914 a[0] * b[2] - a[1] * b[3] + a[2] * b[0] + a[3] * b[1],
915 a[0] * b[3] + a[1] * b[2] - a[2] * b[1] + a[3] * b[0]);
class A(deque< T, A >)) ARMARX_OVERLOAD_STD_HASH_FOR_ITERABLE((class T
Enables hashing of std::list.
static ScalarT Abs(ScalarT s)
ThisType & operator=(T v)
VectorXD< 4, T > SuperType
Quaternion(T w, T x, T y, T z)
Quaternion< T > Inverse() const
void Rotation(T deg, const VectorXD< 3, T > &a)
void Rotation(T *deg, T *a0, T *a1, T *a2) const
void RotationRad(T rad, T a0, T a1, T a2)
Quaternion< T > & operator*=(const Quaternion< T > &b)
void Rotate(const V &p, V *r) const
void Rotation(T *deg, VectorXD< 3, T > *axis) const
void Rotation(T deg, T a0, T a1, T a2)
void RotationRad(T *rad, T *a0, T *a1, T *a2) const
Quaternion< T > Conjugate() const
void RotationMatrix(M *mat)
ThisType & operator=(const MatrixXX< 1, D, S > &v)
ScalarType SqrLength() const
ScalarType Distance(const VectorXD< D, T > &v) const
VectorXD(const VectorXD< D, T > &v)
VectorXD(const SuperType &s)
VectorXD(const VectorXD< D, S > &v)
const ScalarType * begin() const
ScalarType Length() const
VectorXD< D, T > & operator-=(const MatrixXX< 1, D, T > &a)
VectorXD(T x, T y, T z, T w)
VectorXD(const VectorXD< D - 3, T > &v, T s, T s2, T s3)
VectorXD(const VectorXD< D - 1, T > &v, T s)
const ScalarType * const_iterator
ScalarType MaxDistance(const VectorXD< D, T > &v) const
VectorXD(const VectorXD< X, T > &vec)
ThisType & operator=(const SuperType &s)
ScalarType L1Distance(const VectorXD< D, T > &v) const
bool operator==(const VectorXD< D, T > &a) const
const ScalarType * end() const
VectorXD(const VectorXD< D - 2, T > &v, T s, T s2)
ScalarType & operator[](unsigned int i)
ScalarType L1Length() const
VectorXD< D, T > operator-() const
VectorXD< Dim+1, T > Homogene() const
MatrixXX< 1, D, ScalarType > SuperType
VectorXD< D, T > & operator*=(S s)
ThisType & operator=(const ThisType &v)
ScalarType SqrDistance(const VectorXD< D, T > &v) const
ScalarType operator[](unsigned int i) const
VectorXD< D, ScalarType > ThisType
VectorXD< D, T > & operator+=(const MatrixXX< 1, D, T > &a)
VectorXD(const S x, typename std::enable_if< std::is_convertible< S, ScalarType >::value, NullClass >::type &dummy= *((NullClass *) 0))
VectorXD< D, T > & operator/=(S s)
VectorXD< 1, unsigned int > uvec1
VectorXD< 2, float > vec2
VectorXD< 4, double > Vec4d
VectorXD< 3, float > Vec3f
VectorXD< 4, float > Vector4Df
MatrixXX< C, R, T > min(const MatrixXX< C, R, T > &a, const MatrixXX< C, R, T > &b)
const MatrixXX< C, R, T > operator+(const MatrixXX< C, R, T > &a, const MatrixXX< C, R, T > &b)
VectorXD< 2, float > vec2f
VectorXD< 2, double > Vec2d
const MatrixXX< C, R, T > operator*(T s, const MatrixXX< C, R, T > &a)
VectorXD< 2, unsigned int > uvec2
VectorXD< 1, double > Vector1Dd
std::ostream & operator<<(std::ostream &o, const Array< DimT, IteratorT > &a)
VectorXD< 1, float > Vec1f
VectorXD< 4, double > Vector4Dd
VectorXD< 3, double > Vector3Dd
VectorXD< 3, double > Vec3d
VectorXD< 3, float > Vector3Df
VectorXD< 2, float > Vec2f
MatrixXX< C, R, T > operator-(const MatrixXX< C, R, T > &a)
VectorXD< 4, float > vec4f
VectorXD< 3, unsigned int > uvec3
MatrixXX< B, A, T > OuterProduct(const VectorXD< A, T > &a, const VectorXD< B, T > &b)
VectorXD< 3, float > vec3
const VectorXD< 3, T > operator%(const VectorXD< 3, T > &a, const VectorXD< 3, T > &b)
VectorXD< 2, double > Vector2Dd
VectorXD< D, T > sqrt(const VectorXD< D, T > &a)
VectorXD< 1, double > Vec1d
VectorXD< 4, unsigned int > uvec4
VectorXD< D, T > operator/(const VectorXD< D, T > &a, T s)
VectorXD< 1, float > Vector1Df
MatrixXX< C, R, T > max(const MatrixXX< C, R, T > &a, const MatrixXX< C, R, T > &b)
VectorXD< 2, float > Vector2Df
VectorXD< 4, float > Vec4f
VectorXD< 4, float > vec4
MatrixXX< D, D, T > SqrOuterProduct(const VectorXD< D, T > &a)
VectorXD< 1, float > vec1f
VectorXD< 1, float > vec1
VectorXD< 3, float > vec3f
This file offers overloads of toIce() and fromIce() functions for STL container types.