00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef RTC_SMAT3_H
00020 #define RTC_SMAT3_H
00021
00022
00023 #include "rtc/rtcMath.h"
00024 #include "rtc/rtcVec3.h"
00025 #include "rtc/rtcSMat.h"
00026
00027
00028 namespace rtc {
00029
00030
00031 template <class T, int M> class SMat;
00032 template <class T> class Vec3;
00033 template <class T> class SMat3;
00034
00039 template <class T>
00040 class SMat3: public SMat<T,3> {
00041 public:
00042
00043 using SMat<T,3>::x;
00044 using SMat<T,3>::set;
00045
00046
00047 SMat3();
00048 SMat3(const T* d);
00049 SMat3(const T diagVal);
00050 SMat3(const Vec3<T>& diagVec);
00051 SMat3(const Mat<T,3,3>& m);
00052 SMat3(const T x11, const T x12, const T x13,
00053 const T x21, const T x22, const T x23,
00054 const T x31, const T x32, const T x33);
00055 SMat3(const Vec3<T>& q0, const Vec3<T>& q1, const Vec3<T>& q2);
00056
00057
00058 template <class U> SMat3(const Mat<U,3,3>& m);
00059
00060
00061 static SMat3<T> fromRows(const Vec3<T>& v0, const Vec3<T>& v1, const Vec3<T>& v2);
00062 static SMat3<T> fromCols(const Vec3<T>& v0, const Vec3<T>& v1, const Vec3<T>& v2);
00063
00064
00065 void set(const T x11, const T x12, const T x13,
00066 const T x21, const T x22, const T x23,
00067 const T x31, const T x32, const T x33);
00068 void setRows(const Vec3<T>& v0, const Vec3<T>& v1, const Vec3<T>& v2);
00069 void setCols(const Vec3<T>& v0, const Vec3<T>& v1, const Vec3<T>& v2);
00070
00071
00072 T det() const;
00073 SMat3<T> inverted() const;
00074 int invert();
00075 };
00076
00077
00078 typedef SMat3<bool> SMat3b;
00079 typedef SMat3<char> SMat3c;
00080 typedef SMat3<unsigned char> SMat3uc;
00081 typedef SMat3<int> SMat3i;
00082 typedef SMat3<float> SMat3f;
00083 typedef SMat3<double> SMat3d;
00084
00085
00086
00087
00088
00089
00090
00093 template <class T>
00094 inline SMat3<T>::SMat3() {}
00095
00099 template <class T>
00100 inline SMat3<T>::SMat3(const T* d) : SMat<T,3>(d) {}
00101
00105 template <class T>
00106 inline SMat3<T>::SMat3(const T diagVal) : SMat<T,3>(diagVal) {}
00107
00111 template <class T>
00112 inline SMat3<T>::SMat3(const Vec3<T>& diagVec) : SMat<T,3>(diagVec) { }
00113
00116 template <class T>
00117 inline SMat3<T>::SMat3(const Mat<T,3,3>& m) : SMat<T,3>(m) {}
00118
00121 template <class T>
00122 inline SMat3<T>::SMat3(const T x11, const T x12, const T x13,
00123 const T x21, const T x22, const T x23,
00124 const T x31, const T x32, const T x33) {
00125 set(x11, x12, x13, x21, x22, x23, x31, x32, x33);
00126 }
00127
00130 template <class T>
00131 inline SMat3<T>::SMat3(const Vec3<T>& v0, const Vec3<T>& v1,
00132 const Vec3<T>& v2) {
00133 setCols(v0,v1,v2);
00134 }
00135
00136
00137
00140 template <class T> template <class U>
00141 inline SMat3<T>::SMat3(const Mat<U,3,3>& m) : SMat<T,3>(m) {}
00142
00143
00144
00147 template <class T>
00148 inline SMat3<T> SMat3<T>::fromRows(const Vec3<T>& v0, const Vec3<T>& v1,
00149 const Vec3<T>& v2) {
00150 SMat3<T> m;
00151 m.setRows(v0,v1,v2);
00152 return m;
00153 }
00154
00157 template <class T>
00158 inline SMat3<T> SMat3<T>::fromCols(const Vec3<T>& v0, const Vec3<T>& v1,
00159 const Vec3<T>& v2) {
00160 SMat3<T> m;
00161 m.setCols(v0,v1,v2);
00162 return m;
00163 }
00164
00165
00166
00169 template <class T>
00170 inline void SMat3<T>::set(const T x11, const T x12, const T x13,
00171 const T x21, const T x22, const T x23,
00172 const T x31, const T x32, const T x33) {
00173 x[0] = x11; x[1] = x12; x[2] = x13;
00174 x[3] = x21; x[4] = x22; x[5] = x23;
00175 x[6] = x31; x[7] = x32; x[8] = x33;
00176 }
00177
00180 template <class T>
00181 inline void SMat3<T>::setRows(const Vec3<T>& v0, const Vec3<T>& v1,
00182 const Vec3<T>& v2) {
00183 setRow(0,v0); setRow(1,v1); setRow(2,v2);
00184 }
00185
00188 template <class T>
00189 inline void SMat3<T>::setCols(const Vec3<T>& v0, const Vec3<T>& v1,
00190 const Vec3<T>& v2) {
00191 setCol(0,v0); setCol(1,v1); setCol(2,v2);
00192 }
00193
00194
00195
00198 template <class T>
00199 inline T SMat3<T>::det() const {
00200 return (x[0]*(x[4]*x[8] - x[7]*x[5]) -
00201 x[1]*(x[3]*x[8] - x[6]*x[5]) +
00202 x[2]*(x[3]*x[7] - x[6]*x[4]));
00203 }
00204
00208 template <class T>
00209 inline SMat3<T> SMat3<T>::inverted() const {
00210 T d = det();
00211 if (d == 0.0) {
00212 throw Exception( "SMat3::inverted(): error, can't take inverse of singular matrix.");
00213 }
00214 T di = T(1)/d;
00215 return SMat3<T>((x[4]*x[8] - x[5]*x[7])*di, (x[2]*x[7] - x[1]*x[8])*di,
00216 (x[1]*x[5] - x[2]*x[4])*di, (x[5]*x[6] - x[3]*x[8])*di,
00217 (x[0]*x[8] - x[2]*x[6])*di, (x[2]*x[3] - x[0]*x[5])*di,
00218 (x[3]*x[7] - x[4]*x[6])*di, (x[1]*x[6] - x[0]*x[7])*di,
00219 (x[0]*x[4] - x[1]*x[3])*di);
00220 }
00221
00224 template <class T>
00225 inline int SMat3<T>::invert() {
00226 T d = det();
00227 if (d == 0.0) {
00228 throw Exception( "SMat3::inverted(): error, can't take inverse of singular matrix.");
00229 }
00230 T di = T(1)/d;
00231 set((x[4]*x[8] - x[5]*x[7])*di, (x[2]*x[7] - x[1]*x[8])*di,
00232 (x[1]*x[5] - x[2]*x[4])*di, (x[5]*x[6] - x[3]*x[8])*di,
00233 (x[0]*x[8] - x[2]*x[6])*di, (x[2]*x[3] - x[0]*x[5])*di,
00234 (x[3]*x[7] - x[4]*x[6])*di, (x[1]*x[6] - x[0]*x[7])*di,
00235 (x[0]*x[4] - x[1]*x[3])*di);
00236 return 0;
00237 }
00238
00239
00240 }
00241
00242 #endif // RTC_SMAT3_H defined
00243