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