Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Mat2.h

Go to the documentation of this file.
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

Generated at Sat Aug 5 00:16:47 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000