00001 /* 00002 File: Mat2.h 00003 00004 Function: Defines a 2 x 2 matrix. 00005 00006 Author(s): Andrew Willmott 00007 00008 Copyright: (c) 1995-2000, Andrew Willmott 00009 */ 00010 00011 #ifndef __Mat2__ 00012 #define __Mat2__ 00013 00014 #include "vl/VL.h" 00015 // Defines the actual type for TMat2 etc. 00016 #include "vl/Vec2.h" 00017 00018 00019 // --- Mat2 Class ------------------------------------------------------------- 00020 00021 class TMat2 00022 { 00023 public: 00024 00025 // Constructors 00026 00027 inline TMat2(); 00028 inline TMat2(TMReal a, TMReal b, TMReal c, TMReal d);// Create from rows 00029 inline TMat2(const TMat2 &m); // Copy constructor 00030 inline TMat2(ZeroOrOne k); 00031 inline TMat2(Block k); 00032 00033 // Accessor functions 00034 00035 inline Int Rows() const { return(2); }; 00036 inline Int Cols() const { return(2); }; 00037 00038 inline TMVec2 &operator [] (Int i); 00039 inline const TMVec2 &operator [] (Int i) const; 00040 00041 inline TMReal *Ref() const; // Return pointer to data 00042 00043 // Assignment operators 00044 00045 inline TMat2 &operator = (const TMat2 &m); 00046 inline TMat2 &operator = (ZeroOrOne k); 00047 inline TMat2 &operator = (Block k); 00048 inline TMat2 &operator += (const TMat2 &m); 00049 inline TMat2 &operator -= (const TMat2 &m); 00050 inline TMat2 &operator *= (const TMat2 &m); 00051 inline TMat2 &operator *= (TMReal s); 00052 inline TMat2 &operator /= (TMReal s); 00053 00054 // Comparison operators 00055 00056 Bool operator == (const TMat2 &m) const; // M == N? 00057 Bool operator != (const TMat2 &m) const; // M != N? 00058 00059 // Arithmetic operators 00060 00061 inline TMat2 operator + (const TMat2 &m) const; // M + N 00062 inline TMat2 operator - (const TMat2 &m) const; // M - N 00063 inline TMat2 operator - () const; // -M 00064 inline TMat2 operator * (const TMat2 &m) const; // M * N 00065 inline TMat2 operator * (TMReal s) const; // M * s 00066 inline TMat2 operator / (TMReal s) const; // M / s 00067 00068 // Initialisers 00069 00070 inline Void MakeZero(); // Zero matrix 00071 inline Void MakeDiag(TMReal k = vl_one); // I 00072 inline Void MakeBlock(TMReal k = vl_one); // all elts=k 00073 00074 // Vector Transformations 00075 00076 TMat2& MakeRot(Real theta); 00077 TMat2& MakeScale(const TMVec2 &s); 00078 00079 protected: 00080 // Private... 00081 TMVec2 row[2]; // Rows of the matrix 00082 }; 00083 00084 00085 // --- Matrix operators ------------------------------------------------------- 00086 00087 00088 inline TMVec2 &operator *= (TMVec2 &v, const TMat2 &m); // v *= m 00089 inline TMVec2 operator * (const TMat2 &m, const TMVec2 &v);// m * v 00090 inline TMVec2 operator * (const TMVec2 &v, const TMat2 &m);// v * m 00091 inline TMat2 operator * (TMReal s, const TMat2 &m); // s * m 00092 00093 inline TMat2 trans(const TMat2 &m); // Transpose 00094 inline TMReal trace(const TMat2 &m); // Trace 00095 inline TMat2 adj(const TMat2 &m); // Adjoint 00096 TMReal det(const TMat2 &m); // Determinant 00097 TMat2 inv(const TMat2 &m); // Inverse 00098 TMat2 oprod(const TMVec2 &a, const TMVec2 &b); 00099 // Outer product 00100 00101 // The xform functions help avoid dependence on whether row or column 00102 // vectors are used to represent points and vectors. 00103 inline TVec2 xform(const TMat2 &m, const TVec2 &v); // Transform of v by m 00104 inline TMat2 xform(const TMat2 &m, const TMat2 &n); // Xform v -> m(n(v)) 00105 00106 ostream &operator << (ostream &s, const TMat2 &m); 00107 istream &operator >> (istream &s, TMat2 &m); 00108 00109 00110 // --- Inlines ---------------------------------------------------------------- 00111 00112 00113 inline TMVec2 &TMat2::operator [] (Int i) 00114 { 00115 CheckRange(i, 0, 2, "(Mat2::[i]) index out of range"); 00116 return(row[i]); 00117 } 00118 00119 inline const TMVec2 &TMat2::operator [] (Int i) const 00120 { 00121 CheckRange(i, 0, 2, "(Mat2::[i]) index out of range"); 00122 return(row[i]); 00123 } 00124 00125 inline TMReal *TMat2::Ref() const 00126 { 00127 return((TMReal*) row); 00128 } 00129 00130 inline TMat2::TMat2() 00131 { 00132 } 00133 00134 inline TMat2::TMat2(TMReal a, TMReal b, TMReal c, TMReal d) 00135 { 00136 row[0][0] = a; row[0][1] = b; 00137 row[1][0] = c; row[1][1] = d; 00138 } 00139 00140 inline TMat2::TMat2(const TMat2 &m) 00141 { 00142 row[0] = m[0]; 00143 row[1] = m[1]; 00144 } 00145 00146 00147 inline Void TMat2::MakeZero() 00148 { 00149 row[0][0] = vl_zero; row[0][1] = vl_zero; 00150 row[1][0] = vl_zero; row[1][1] = vl_zero; 00151 } 00152 00153 inline Void TMat2::MakeDiag(TMReal k) 00154 { 00155 row[0][0] = k; row[0][1] = vl_zero; 00156 row[1][0] = vl_zero; row[1][1] = k; 00157 } 00158 00159 inline Void TMat2::MakeBlock(TMReal k) 00160 { 00161 row[0][0] = k; row[0][1] = k; 00162 row[1][0] = k; row[1][1] = k; 00163 } 00164 00165 inline TMat2::TMat2(ZeroOrOne k) 00166 { 00167 MakeDiag(k); 00168 } 00169 00170 inline TMat2::TMat2(Block k) 00171 { 00172 MakeBlock((ZeroOrOne) k); 00173 } 00174 00175 inline TMat2 &TMat2::operator = (ZeroOrOne k) 00176 { 00177 MakeDiag(k); 00178 00179 return(SELF); 00180 } 00181 00182 inline TMat2 &TMat2::operator = (Block k) 00183 { 00184 MakeBlock((ZeroOrOne) k); 00185 00186 return(SELF); 00187 } 00188 00189 inline TMat2 &TMat2::operator = (const TMat2 &m) 00190 { 00191 row[0] = m[0]; 00192 row[1] = m[1]; 00193 00194 return(SELF); 00195 } 00196 00197 inline TMat2 &TMat2::operator += (const TMat2 &m) 00198 { 00199 row[0] += m[0]; 00200 row[1] += m[1]; 00201 00202 return(SELF); 00203 } 00204 00205 inline TMat2 &TMat2::operator -= (const TMat2 &m) 00206 { 00207 row[0] -= m[0]; 00208 row[1] -= m[1]; 00209 00210 return(SELF); 00211 } 00212 00213 inline TMat2 &TMat2::operator *= (const TMat2 &m) 00214 { 00215 SELF = SELF * m; 00216 00217 return(SELF); 00218 } 00219 00220 inline TMat2 &TMat2::operator *= (TMReal s) 00221 { 00222 row[0] *= s; 00223 row[1] *= s; 00224 00225 return(SELF); 00226 } 00227 00228 inline TMat2 &TMat2::operator /= (TMReal s) 00229 { 00230 row[0] /= s; 00231 row[1] /= s; 00232 00233 return(SELF); 00234 } 00235 00236 00237 inline TMat2 TMat2::operator + (const TMat2 &m) const 00238 { 00239 TMat2 result; 00240 00241 result[0] = row[0] + m[0]; 00242 result[1] = row[1] + m[1]; 00243 00244 return(result); 00245 } 00246 00247 inline TMat2 TMat2::operator - (const TMat2 &m) const 00248 { 00249 TMat2 result; 00250 00251 result[0] = row[0] - m[0]; 00252 result[1] = row[1] - m[1]; 00253 00254 return(result); 00255 } 00256 00257 inline TMat2 TMat2::operator - () const 00258 { 00259 TMat2 result; 00260 00261 result[0] = -row[0]; 00262 result[1] = -row[1]; 00263 00264 return(result); 00265 } 00266 00267 inline TMat2 TMat2::operator * (const TMat2 &m) const 00268 { 00269 #define N(x,y) row[x][y] 00270 #define M(x,y) m.row[x][y] 00271 #define R(x,y) result[x][y] 00272 00273 TMat2 result; 00274 00275 R(0,0) = N(0,0) * M(0,0) + N(0,1) * M(1,0); 00276 R(0,1) = N(0,0) * M(0,1) + N(0,1) * M(1,1); 00277 R(1,0) = N(1,0) * M(0,0) + N(1,1) * M(1,0); 00278 R(1,1) = N(1,0) * M(0,1) + N(1,1) * M(1,1); 00279 00280 return(result); 00281 00282 #undef N 00283 #undef M 00284 #undef R 00285 } 00286 00287 inline TMat2 TMat2::operator * (TMReal s) const 00288 { 00289 TMat2 result; 00290 00291 result[0] = row[0] * s; 00292 result[1] = row[1] * s; 00293 00294 return(result); 00295 } 00296 00297 inline TMat2 TMat2::operator / (TMReal s) const 00298 { 00299 TMat2 result; 00300 00301 result[0] = row[0] / s; 00302 result[1] = row[1] / s; 00303 00304 return(result); 00305 } 00306 00307 inline TMat2 operator * (TMReal s, const TMat2 &m) 00308 { 00309 return(m * s); 00310 } 00311 00312 inline TMVec2 operator * (const TMat2 &m, const TMVec2 &v) 00313 { 00314 TMVec2 result; 00315 00316 result[0] = m[0][0] * v[0] + m[0][1] * v[1]; 00317 result[1] = m[1][0] * v[0] + m[1][1] * v[1]; 00318 00319 return(result); 00320 } 00321 00322 inline TMVec2 operator * (const TMVec2 &v, const TMat2 &m) 00323 { 00324 TMVec2 result; 00325 00326 result[0] = v[0] * m[0][0] + v[1] * m[1][0]; 00327 result[1] = v[0] * m[0][1] + v[1] * m[1][1]; 00328 00329 return(result); 00330 } 00331 00332 inline TMVec2 &operator *= (TMVec2 &v, const TMat2 &m) 00333 { 00334 TMReal t; 00335 00336 t = v[0] * m[0][0] + v[1] * m[1][0]; 00337 v[1] = v[0] * m[0][1] + v[1] * m[1][1]; 00338 v[0] = t; 00339 00340 return(v); 00341 } 00342 00343 00344 inline TMat2 trans(const TMat2 &m) 00345 { 00346 TMat2 result; 00347 00348 result[0][0] = m[0][0]; result[0][1] = m[1][0]; 00349 result[1][0] = m[0][1]; result[1][1] = m[1][1]; 00350 00351 return(result); 00352 } 00353 00354 inline TMReal trace(const TMat2 &m) 00355 { 00356 return(m[0][0] + m[1][1]); 00357 } 00358 00359 inline TMat2 adj(const TMat2 &m) 00360 { 00361 TMat2 result; 00362 00363 result[0] = cross(m[1]); 00364 result[1] = -cross(m[0]); 00365 00366 return(result); 00367 } 00368 00369 #ifdef VL_ROW_ORIENT 00370 inline TVec2 xform(const TMat2 &m, const TVec2 &v) 00371 { return(v * m); } 00372 inline TMat2 xform(const TMat2 &m, const TMat2 &n) 00373 { return(n * m); } 00374 #else 00375 inline TVec2 xform(const TMat2 &m, const TVec2 &v) 00376 { return(m * v); } 00377 inline TMat2 xform(const TMat2 &m, const TMat2 &n) 00378 { return(m * n); } 00379 #endif 00380 00381 #endif