![]() |
VR-Link API Documentation for DIS
|
00001 /********************************************************************* 00002 ** Copyright (c) 1992-2010 VT MAK 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 00006 00007 #ifndef vlDcm_H_ 00008 #define vlDcm_H_ 00009 00010 #include "vlVector.h" 00011 #include "directRotRate.h" 00012 00016 00017 00018 #ifdef DtUSE_UTILITIES_NAMESPACE 00019 namespace DtUSE_UTILITIES_NAMESPACE 00020 { 00021 #endif 00022 00023 class DtQuaternion; 00024 class DtTaitBryan; 00025 class DT_DLL_MATRIX DtDcm; 00026 00027 00029 typedef DtVector DtBodyRates; 00030 00039 class DT_DLL_MATRIX DtDcm 00040 { 00041 public: 00042 00044 DtDcm(); 00045 00047 DtDcm(double a, double b, double c, 00048 double d, double e, double f, 00049 double g, double h, double i); 00050 00052 DtDcm(const DtVector& a, const DtVector& b, const DtVector& c); 00053 00055 DtDcm(const DtDcm &other); 00056 00058 DtDcm(const DtQuaternion &quat); 00059 00061 DtDcm(const DtTaitBryan &tb); 00062 00064 DtDcm &operator=(const DtDcm &other); 00065 00068 int operator==(const DtDcm& other) const; 00069 00072 int operator!=(const DtDcm& other) const; 00073 00075 bool isOrthonormal() const; 00076 00078 operator DtVector* (); 00079 operator const DtVector* () const; 00080 00082 DtVector &operator[](int i); 00083 const DtVector &operator[](int i) const; 00084 00086 void print() const; 00087 00089 void setToZero(); 00090 00091 public: 00092 static const DtDcm& zero(); 00093 static const DtDcm& identity(); 00094 00095 protected: 00096 DtVector rep[3]; 00097 }; 00098 00102 00103 DT_DLL_MATRIX void DtDcmDcmRotAxis(const DtDcm& a2ref, const DtDcm& b2ref, DtVector& n /* a2b */); 00104 DT_DLL_MATRIX void DtDcmIdentInit(DtDcm& m); 00105 00106 00108 DT_DLL_MATRIX void DtDcmFixMatrix(DtDcm& mat, int axis); 00109 00110 DT_DLL_MATRIX double DtDcmDeterminant(const DtDcm& m); 00111 DT_DLL_MATRIX void DtDcmAdd(const DtDcm& m1, const DtDcm& m2, DtDcm& result); /* result = m1 + m2 */ 00112 DT_DLL_MATRIX void DtDcmSub(const DtDcm& m1, const DtDcm& m2, DtDcm& result); /* result = m1 - m2 */ 00113 DT_DLL_MATRIX void DtDcmDcmMul(const DtDcm& m1, const DtDcm& m2, DtDcm& result); /* result = m1 x m2 */ 00114 DT_DLL_MATRIX void DtDcmTranspose(const DtDcm& m, DtDcm& result); 00115 DT_DLL_MATRIX void DtDcmAdjugate(const DtDcm& m, DtDcm& result); 00116 DT_DLL_MATRIX void DtDcmInverse(const DtDcm& m, DtDcm& result); 00117 DT_DLL_MATRIX double DtDcmDcmRotAngle(const DtDcm& a, const DtDcm& b); 00118 00120 #define ZERO 0 00121 #define IDENTITY 1; 00122 DT_DLL_MATRIX void DtM_Init(const DtDcm& input,DtDcm& result,int flag); 00123 DT_DLL_MATRIX void DtSetSym(DtDcm& v,double aa,double ab,double ac,double bb,double bc,double cc); 00124 00125 DT_DLL_MATRIX void DtCreateCross(const DtVector& r,DtDcm& ans); 00126 DT_DLL_MATRIX void DtM(const DtVector& v,DtDcm& m); 00127 DT_DLL_MATRIX void DtRotate(DtDcm& ans,const DtVector& direction,double theta); 00128 00129 00131 DT_DLL_MATRIX void DtDcmScale(const DtDcm& mat, double scale_factor, DtDcm& result); 00132 DT_DLL_MATRIX void DtDcmVecMul(const DtDcm& m, const DtVector& v, DtVector& result); 00133 00136 DT_DLL_MATRIX void DtDcmRotInit(DtDcm& m, double theta, int rot_axis); 00137 00141 DT_DLL_MATRIX void DtDcmRotInit2(DtDcm& m, double sin_theta, int rot_axis); 00142 00146 DT_DLL_MATRIX void DtDcmTrigInit(DtDcm& m, double sin_theta, 00147 double cos_theta, int rot_axis); 00148 00151 DT_DLL_MATRIX void DtDcmForm(const double *axis, double angle, 00152 DtDcm& c, double *sin_ang, double *cos_ang); 00153 00155 DT_DLL_MATRIX void DtTbToMat(const DtTaitBryan &tb, DtDcm& HcW); 00156 00161 DT_DLL_MATRIX void DtDcmLevelInit (DtDcm& m, const DtVector& v); 00162 00170 DT_DLL_MATRIX void DtBodyToMat(DtBodyRates av, const DtDcm& HcW, DtDcm& cDot); 00171 00173 00174 DT_DLL_MATRIX DtDirectedRotRate DtDirectRotRate(const DtVector& pqr); 00175 DT_DLL_MATRIX void DtMakeRotationDcm(const DtDirectedRotRate& drr, double dt, DtDcm& m); 00176 00182 DT_DLL_MATRIX double DtDcmDcmRotTrace(const DtDcm& a, const DtDcm& b); 00183 00185 enum generic_mm_multflag 00186 { 00187 TRANSPOSE_NONE = 0, 00188 TRANSPOSE_M1 = 1, 00189 TRANSPOSE_M2 = 2, 00190 TRANSPOSE_M1_AND_M2 = 3 00191 }; 00192 00193 DT_DLL_MATRIX double DtMM_Mult( const DtDcm& m1, const DtDcm& m2, DtDcm& result, 00194 generic_mm_multflag flag=TRANSPOSE_NONE); 00195 00196 00198 DT_DLL_MATRIX void DtDcmDump(const char *str, const DtDcm& mat); 00199 00201 DT_DLL_MATRIX void DtDcmFromQuaternion(DtDcm& m,const DtQuaternion *q); 00202 00204 DT_DLL_MATRIX int DtDcmCheck(const DtDcm& m); 00205 00207 DT_DLL_MATRIX void DtDcmCopy(const DtDcm& src, DtDcm& dest); 00208 00210 DT_DLL_MATRIX void DtDcmInit(DtDcm& m); 00211 00213 typedef const DtDcm &DtConstDcm; 00214 00216 typedef DtDcm &DtDcmRef; 00217 00218 00220 #define vlDcm_inl 00221 #include "vlDcm.inl" 00222 #undef vlDcm_inl 00223 00224 #ifdef DtUSE_UTILITIES_NAMESPACE 00225 } 00226 #endif 00227 00228 00229 #endif 00230 00231