00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef WFMATH_ROTMATRIX_H
00027 #define WFMATH_ROTMATRIX_H
00028
00029 #include <wfmath/const.h>
00030
00031 namespace WFMath {
00032
00033 template<const int dim> class Vector;
00034 class Quaternion;
00035
00036 template<const int dim> class RotMatrix;
00037
00039 template<const int dim>
00040 RotMatrix<dim> Prod(const RotMatrix<dim>& m1, const RotMatrix<dim>& m2);
00042 template<const int dim>
00043 RotMatrix<dim> ProdInv(const RotMatrix<dim>& m1, const RotMatrix<dim>& m2);
00045 template<const int dim>
00046 RotMatrix<dim> InvProd(const RotMatrix<dim>& m1, const RotMatrix<dim>& m2);
00048 template<const int dim>
00049 RotMatrix<dim> InvProdInv(const RotMatrix<dim>& m1, const RotMatrix<dim>& m2);
00050
00051 template<const int dim>
00052 Vector<dim> Prod(const RotMatrix<dim>& m, const Vector<dim>& v);
00053 template<const int dim>
00054 Vector<dim> InvProd(const RotMatrix<dim>& m, const Vector<dim>& v);
00055 template<const int dim>
00056 Vector<dim> Prod(const Vector<dim>& v, const RotMatrix<dim>& m);
00057 template<const int dim>
00058 Vector<dim> ProdInv(const Vector<dim>& v, const RotMatrix<dim>& m);
00059
00061 template<const int dim>
00062 RotMatrix<dim> operator*(const RotMatrix<dim>& m1, const RotMatrix<dim>& m2);
00063 template<const int dim>
00064 Vector<dim> operator*(const RotMatrix<dim>& m, const Vector<dim>& v);
00065 template<const int dim>
00066 Vector<dim> operator*(const Vector<dim>& v, const RotMatrix<dim>& m);
00067
00068 template<const int dim>
00069 std::ostream& operator<<(std::ostream& os, const RotMatrix<dim>& m);
00070 template<const int dim>
00071 std::istream& operator>>(std::istream& is, RotMatrix<dim>& m);
00072
00074
00089 template<const int dim>
00090 class RotMatrix {
00091 public:
00093 RotMatrix() : m_valid(false) {}
00095 RotMatrix(const RotMatrix& m);
00096
00097 friend std::ostream& operator<< <dim>(std::ostream& os, const RotMatrix& m);
00098 friend std::istream& operator>> <dim>(std::istream& is, RotMatrix& m);
00099
00100 RotMatrix& operator=(const RotMatrix& m);
00101
00102
00103
00104 bool isEqualTo(const RotMatrix& m, double epsilon = WFMATH_EPSILON) const;
00105
00106 bool operator==(const RotMatrix& m) const {return isEqualTo(m);}
00107 bool operator!=(const RotMatrix& m) const {return !isEqualTo(m);}
00108
00109 bool isValid() const {return m_valid;}
00110
00112 RotMatrix& identity();
00113
00115 CoordType elem(const int i, const int j) const
00116 {assert(i >= 0 && j >= 0 && i < dim && j < dim); return m_elem[i][j];}
00117
00119
00126 bool setVals(const CoordType vals[dim][dim], double precision = WFMATH_EPSILON);
00128
00135 bool setVals(const CoordType vals[dim*dim], double precision = WFMATH_EPSILON);
00136
00138 Vector<dim> row(const int i) const;
00140 Vector<dim> column(const int i) const;
00141
00143 CoordType trace() const;
00145
00148 CoordType determinant() const {return (CoordType) (m_flip ? -1 : 1);}
00150
00153 RotMatrix inverse() const;
00155
00158 bool parity() const {return m_flip;}
00159
00160
00161
00162 friend RotMatrix Prod<dim> (const RotMatrix& m1, const RotMatrix& m2);
00163 friend RotMatrix ProdInv<dim> (const RotMatrix& m1, const RotMatrix& m2);
00164 friend RotMatrix InvProd<dim> (const RotMatrix& m1, const RotMatrix& m2);
00165 friend RotMatrix InvProdInv<dim> (const RotMatrix& m1, const RotMatrix& m2);
00166 friend Vector<dim> Prod<dim> (const RotMatrix& m, const Vector<dim>& v);
00167 friend Vector<dim> InvProd<dim> (const RotMatrix& m, const Vector<dim>& v);
00168
00169
00170
00172 RotMatrix& rotation (const int i, const int j, CoordType theta);
00174
00177 RotMatrix& rotation (const Vector<dim>& v1, const Vector<dim>& v2,
00178 CoordType theta);
00180
00185 RotMatrix& rotation (const Vector<dim>& from, const Vector<dim>& to);
00186
00187
00188
00190 RotMatrix& mirror(const int i);
00192 RotMatrix& mirror(const Vector<dim>& v);
00194
00197 RotMatrix& mirror();
00198
00200 RotMatrix& rotate(const RotMatrix& m) {return *this = Prod(*this, m);}
00201
00203 void normalize();
00205 unsigned age() const {return m_age;}
00206
00207
00208
00210
00216 RotMatrix(const Quaternion& q, const bool not_flip = true)
00217 {fromQuaternion(q, not_flip);}
00218
00220 RotMatrix<2>& rotation(CoordType theta)
00221 {return rotation(0, 1, theta);}
00222
00224 RotMatrix<3>& rotationX(CoordType theta) {return rotation(1, 2, theta);}
00226 RotMatrix<3>& rotationY(CoordType theta) {return rotation(2, 0, theta);}
00228 RotMatrix<3>& rotationZ(CoordType theta) {return rotation(0, 1, theta);}
00230 RotMatrix<3>& rotation(const Vector<3>& axis, CoordType theta);
00232
00235 RotMatrix<3>& rotation(const Vector<3>& axis);
00236
00238
00244 RotMatrix<3>& fromQuaternion(const Quaternion& q, const bool not_flip = true);
00245
00247 RotMatrix<3>& rotate(const Quaternion&);
00248
00250 RotMatrix& mirrorX() {return mirror(0);}
00252 RotMatrix& mirrorY() {return mirror(1);}
00254 RotMatrix& mirrorZ() {return mirror(2);}
00255
00256 private:
00257 CoordType m_elem[dim][dim];
00258 bool m_flip;
00259 bool m_valid;
00260 unsigned m_age;
00261
00262
00263 bool _setVals(CoordType *vals, double precision = WFMATH_EPSILON);
00264 void checkNormalization() {if(m_age >= WFMATH_MAX_NORM_AGE && m_valid) normalize();}
00265 };
00266
00267 }
00268
00269 #include <wfmath/rotmatrix_funcs.h>
00270
00271 #endif // WFMATH_ROTMATRIX_H