Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

Committer:
BartJanssens
Date:
Mon Jan 04 15:19:10 2016 +0000
Revision:
0:785cff1e5a7c
svl-1.5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Mat2.h
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Defines a 2 x 2 matrix.
BartJanssens 0:785cff1e5a7c 5
BartJanssens 0:785cff1e5a7c 6 Author(s): Andrew Willmott
BartJanssens 0:785cff1e5a7c 7
BartJanssens 0:785cff1e5a7c 8 Copyright: (c) 1995-2001, Andrew Willmott
BartJanssens 0:785cff1e5a7c 9 */
BartJanssens 0:785cff1e5a7c 10
BartJanssens 0:785cff1e5a7c 11 #ifndef __Mat2__
BartJanssens 0:785cff1e5a7c 12 #define __Mat2__
BartJanssens 0:785cff1e5a7c 13
BartJanssens 0:785cff1e5a7c 14 #include "Vec2.h"
BartJanssens 0:785cff1e5a7c 15
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17 // --- Mat2 Class -------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 18
BartJanssens 0:785cff1e5a7c 19 class Mat2
BartJanssens 0:785cff1e5a7c 20 {
BartJanssens 0:785cff1e5a7c 21 public:
BartJanssens 0:785cff1e5a7c 22
BartJanssens 0:785cff1e5a7c 23 // Constructors
BartJanssens 0:785cff1e5a7c 24
BartJanssens 0:785cff1e5a7c 25 Mat2();
BartJanssens 0:785cff1e5a7c 26 Mat2(Real a, Real b, Real c, Real d); // Create from rows
BartJanssens 0:785cff1e5a7c 27 Mat2(const Mat2 &m); // Copy constructor
BartJanssens 0:785cff1e5a7c 28 Mat2(ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 29 Mat2(Block k);
BartJanssens 0:785cff1e5a7c 30
BartJanssens 0:785cff1e5a7c 31 // Accessor functions
BartJanssens 0:785cff1e5a7c 32
BartJanssens 0:785cff1e5a7c 33 Int Rows() const { return(2); };
BartJanssens 0:785cff1e5a7c 34 Int Cols() const { return(2); };
BartJanssens 0:785cff1e5a7c 35
BartJanssens 0:785cff1e5a7c 36 Vec2 &operator [] (Int i);
BartJanssens 0:785cff1e5a7c 37 const Vec2 &operator [] (Int i) const;
BartJanssens 0:785cff1e5a7c 38
BartJanssens 0:785cff1e5a7c 39 Real *Ref() const; // Return pointer to data
BartJanssens 0:785cff1e5a7c 40
BartJanssens 0:785cff1e5a7c 41 // Assignment operators
BartJanssens 0:785cff1e5a7c 42
BartJanssens 0:785cff1e5a7c 43 Mat2 &operator = (const Mat2 &m);
BartJanssens 0:785cff1e5a7c 44 Mat2 &operator = (ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 45 Mat2 &operator = (Block k);
BartJanssens 0:785cff1e5a7c 46 Mat2 &operator += (const Mat2 &m);
BartJanssens 0:785cff1e5a7c 47 Mat2 &operator -= (const Mat2 &m);
BartJanssens 0:785cff1e5a7c 48 Mat2 &operator *= (const Mat2 &m);
BartJanssens 0:785cff1e5a7c 49 Mat2 &operator *= (Real s);
BartJanssens 0:785cff1e5a7c 50 Mat2 &operator /= (Real s);
BartJanssens 0:785cff1e5a7c 51
BartJanssens 0:785cff1e5a7c 52 // Comparison operators
BartJanssens 0:785cff1e5a7c 53
BartJanssens 0:785cff1e5a7c 54 Bool operator == (const Mat2 &m) const; // M == N?
BartJanssens 0:785cff1e5a7c 55 Bool operator != (const Mat2 &m) const; // M != N?
BartJanssens 0:785cff1e5a7c 56
BartJanssens 0:785cff1e5a7c 57 // Arithmetic operators
BartJanssens 0:785cff1e5a7c 58
BartJanssens 0:785cff1e5a7c 59 Mat2 operator + (const Mat2 &m) const; // M + N
BartJanssens 0:785cff1e5a7c 60 Mat2 operator - (const Mat2 &m) const; // M - N
BartJanssens 0:785cff1e5a7c 61 Mat2 operator - () const; // -M
BartJanssens 0:785cff1e5a7c 62 Mat2 operator * (const Mat2 &m) const; // M * N
BartJanssens 0:785cff1e5a7c 63 Mat2 operator * (Real s) const; // M * s
BartJanssens 0:785cff1e5a7c 64 Mat2 operator / (Real s) const; // M / s
BartJanssens 0:785cff1e5a7c 65
BartJanssens 0:785cff1e5a7c 66 // Initialisers
BartJanssens 0:785cff1e5a7c 67
BartJanssens 0:785cff1e5a7c 68 Void MakeZero(); // Zero matrix
BartJanssens 0:785cff1e5a7c 69 Void MakeDiag(Real k = vl_one); // I
BartJanssens 0:785cff1e5a7c 70 Void MakeBlock(Real k = vl_one); // all elts=k
BartJanssens 0:785cff1e5a7c 71
BartJanssens 0:785cff1e5a7c 72 // Vector Transformations
BartJanssens 0:785cff1e5a7c 73
BartJanssens 0:785cff1e5a7c 74 Mat2& MakeRot(Real theta);
BartJanssens 0:785cff1e5a7c 75 Mat2& MakeScale(const Vec2 &s);
BartJanssens 0:785cff1e5a7c 76
BartJanssens 0:785cff1e5a7c 77 // Private...
BartJanssens 0:785cff1e5a7c 78
BartJanssens 0:785cff1e5a7c 79 protected:
BartJanssens 0:785cff1e5a7c 80
BartJanssens 0:785cff1e5a7c 81 Vec2 row[2]; // Rows of the matrix
BartJanssens 0:785cff1e5a7c 82 };
BartJanssens 0:785cff1e5a7c 83
BartJanssens 0:785cff1e5a7c 84
BartJanssens 0:785cff1e5a7c 85 // --- Matrix operators -------------------------------------------------------
BartJanssens 0:785cff1e5a7c 86
BartJanssens 0:785cff1e5a7c 87 inline Vec2 &operator *= (Vec2 &v, const Mat2 &m); // v *= m
BartJanssens 0:785cff1e5a7c 88 inline Vec2 operator * (const Mat2 &m, const Vec2 &v); // m * v
BartJanssens 0:785cff1e5a7c 89 inline Vec2 operator * (const Vec2 &v, const Mat2 &m); // v * m
BartJanssens 0:785cff1e5a7c 90 inline Mat2 operator * (Real s, const Mat2 &m); // s * m
BartJanssens 0:785cff1e5a7c 91
BartJanssens 0:785cff1e5a7c 92 inline Mat2 trans(const Mat2 &m); // Transpose
BartJanssens 0:785cff1e5a7c 93 inline Real trace(const Mat2 &m); // Trace
BartJanssens 0:785cff1e5a7c 94 inline Mat2 adj(const Mat2 &m); // Adjoint
BartJanssens 0:785cff1e5a7c 95 Real det(const Mat2 &m); // Determinant
BartJanssens 0:785cff1e5a7c 96 Mat2 inv(const Mat2 &m); // Inverse
BartJanssens 0:785cff1e5a7c 97 Mat2 oprod(const Vec2 &a, const Vec2 &b);
BartJanssens 0:785cff1e5a7c 98 // Outer product
BartJanssens 0:785cff1e5a7c 99
BartJanssens 0:785cff1e5a7c 100 // The xform functions help avoid dependence on whether row or column
BartJanssens 0:785cff1e5a7c 101 // vectors are used to represent points and vectors.
BartJanssens 0:785cff1e5a7c 102 inline Vec2 xform(const Mat2 &m, const Vec2 &v); // Transform of v by m
BartJanssens 0:785cff1e5a7c 103 inline Mat2 xform(const Mat2 &m, const Mat2 &n); // xform v -> m(n(v))
BartJanssens 0:785cff1e5a7c 104
BartJanssens 0:785cff1e5a7c 105 //std::ostream &operator << (std::ostream &s, const Mat2 &m);
BartJanssens 0:785cff1e5a7c 106 //std::istream &operator >> (std::istream &s, Mat2 &m);
BartJanssens 0:785cff1e5a7c 107
BartJanssens 0:785cff1e5a7c 108 void printMat2(const Mat2 &m);
BartJanssens 0:785cff1e5a7c 109
BartJanssens 0:785cff1e5a7c 110
BartJanssens 0:785cff1e5a7c 111 // --- Inlines ----------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 112
BartJanssens 0:785cff1e5a7c 113 inline Vec2 &Mat2::operator [] (Int i)
BartJanssens 0:785cff1e5a7c 114 {
BartJanssens 0:785cff1e5a7c 115 CheckRange(i, 0, 2, "(Mat2::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 116 return(row[i]);
BartJanssens 0:785cff1e5a7c 117 }
BartJanssens 0:785cff1e5a7c 118
BartJanssens 0:785cff1e5a7c 119 inline const Vec2 &Mat2::operator [] (Int i) const
BartJanssens 0:785cff1e5a7c 120 {
BartJanssens 0:785cff1e5a7c 121 CheckRange(i, 0, 2, "(Mat2::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 122 return(row[i]);
BartJanssens 0:785cff1e5a7c 123 }
BartJanssens 0:785cff1e5a7c 124
BartJanssens 0:785cff1e5a7c 125 inline Real *Mat2::Ref() const
BartJanssens 0:785cff1e5a7c 126 {
BartJanssens 0:785cff1e5a7c 127 return((Real*) row);
BartJanssens 0:785cff1e5a7c 128 }
BartJanssens 0:785cff1e5a7c 129
BartJanssens 0:785cff1e5a7c 130 inline Mat2::Mat2()
BartJanssens 0:785cff1e5a7c 131 {
BartJanssens 0:785cff1e5a7c 132 }
BartJanssens 0:785cff1e5a7c 133
BartJanssens 0:785cff1e5a7c 134 inline Mat2::Mat2(Real a, Real b, Real c, Real d)
BartJanssens 0:785cff1e5a7c 135 {
BartJanssens 0:785cff1e5a7c 136 row[0][0] = a; row[0][1] = b;
BartJanssens 0:785cff1e5a7c 137 row[1][0] = c; row[1][1] = d;
BartJanssens 0:785cff1e5a7c 138 }
BartJanssens 0:785cff1e5a7c 139
BartJanssens 0:785cff1e5a7c 140 inline Mat2::Mat2(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 141 {
BartJanssens 0:785cff1e5a7c 142 row[0] = m[0];
BartJanssens 0:785cff1e5a7c 143 row[1] = m[1];
BartJanssens 0:785cff1e5a7c 144 }
BartJanssens 0:785cff1e5a7c 145
BartJanssens 0:785cff1e5a7c 146
BartJanssens 0:785cff1e5a7c 147 inline Void Mat2::MakeZero()
BartJanssens 0:785cff1e5a7c 148 {
BartJanssens 0:785cff1e5a7c 149 row[0][0] = vl_zero; row[0][1] = vl_zero;
BartJanssens 0:785cff1e5a7c 150 row[1][0] = vl_zero; row[1][1] = vl_zero;
BartJanssens 0:785cff1e5a7c 151 }
BartJanssens 0:785cff1e5a7c 152
BartJanssens 0:785cff1e5a7c 153 inline Void Mat2::MakeDiag(Real k)
BartJanssens 0:785cff1e5a7c 154 {
BartJanssens 0:785cff1e5a7c 155 row[0][0] = k; row[0][1] = vl_zero;
BartJanssens 0:785cff1e5a7c 156 row[1][0] = vl_zero; row[1][1] = k;
BartJanssens 0:785cff1e5a7c 157 }
BartJanssens 0:785cff1e5a7c 158
BartJanssens 0:785cff1e5a7c 159 inline Void Mat2::MakeBlock(Real k)
BartJanssens 0:785cff1e5a7c 160 {
BartJanssens 0:785cff1e5a7c 161 row[0][0] = k; row[0][1] = k;
BartJanssens 0:785cff1e5a7c 162 row[1][0] = k; row[1][1] = k;
BartJanssens 0:785cff1e5a7c 163 }
BartJanssens 0:785cff1e5a7c 164
BartJanssens 0:785cff1e5a7c 165 inline Mat2::Mat2(ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 166 {
BartJanssens 0:785cff1e5a7c 167 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 168 }
BartJanssens 0:785cff1e5a7c 169
BartJanssens 0:785cff1e5a7c 170 inline Mat2::Mat2(Block k)
BartJanssens 0:785cff1e5a7c 171 {
BartJanssens 0:785cff1e5a7c 172 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 173 }
BartJanssens 0:785cff1e5a7c 174
BartJanssens 0:785cff1e5a7c 175 inline Mat2 &Mat2::operator = (ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 176 {
BartJanssens 0:785cff1e5a7c 177 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 178
BartJanssens 0:785cff1e5a7c 179 return(SELF);
BartJanssens 0:785cff1e5a7c 180 }
BartJanssens 0:785cff1e5a7c 181
BartJanssens 0:785cff1e5a7c 182 inline Mat2 &Mat2::operator = (Block k)
BartJanssens 0:785cff1e5a7c 183 {
BartJanssens 0:785cff1e5a7c 184 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 185
BartJanssens 0:785cff1e5a7c 186 return(SELF);
BartJanssens 0:785cff1e5a7c 187 }
BartJanssens 0:785cff1e5a7c 188
BartJanssens 0:785cff1e5a7c 189 inline Mat2 &Mat2::operator = (const Mat2 &m)
BartJanssens 0:785cff1e5a7c 190 {
BartJanssens 0:785cff1e5a7c 191 row[0] = m[0];
BartJanssens 0:785cff1e5a7c 192 row[1] = m[1];
BartJanssens 0:785cff1e5a7c 193
BartJanssens 0:785cff1e5a7c 194 return(SELF);
BartJanssens 0:785cff1e5a7c 195 }
BartJanssens 0:785cff1e5a7c 196
BartJanssens 0:785cff1e5a7c 197 inline Mat2 &Mat2::operator += (const Mat2 &m)
BartJanssens 0:785cff1e5a7c 198 {
BartJanssens 0:785cff1e5a7c 199 row[0] += m[0];
BartJanssens 0:785cff1e5a7c 200 row[1] += m[1];
BartJanssens 0:785cff1e5a7c 201
BartJanssens 0:785cff1e5a7c 202 return(SELF);
BartJanssens 0:785cff1e5a7c 203 }
BartJanssens 0:785cff1e5a7c 204
BartJanssens 0:785cff1e5a7c 205 inline Mat2 &Mat2::operator -= (const Mat2 &m)
BartJanssens 0:785cff1e5a7c 206 {
BartJanssens 0:785cff1e5a7c 207 row[0] -= m[0];
BartJanssens 0:785cff1e5a7c 208 row[1] -= m[1];
BartJanssens 0:785cff1e5a7c 209
BartJanssens 0:785cff1e5a7c 210 return(SELF);
BartJanssens 0:785cff1e5a7c 211 }
BartJanssens 0:785cff1e5a7c 212
BartJanssens 0:785cff1e5a7c 213 inline Mat2 &Mat2::operator *= (const Mat2 &m)
BartJanssens 0:785cff1e5a7c 214 {
BartJanssens 0:785cff1e5a7c 215 SELF = SELF * m;
BartJanssens 0:785cff1e5a7c 216
BartJanssens 0:785cff1e5a7c 217 return(SELF);
BartJanssens 0:785cff1e5a7c 218 }
BartJanssens 0:785cff1e5a7c 219
BartJanssens 0:785cff1e5a7c 220 inline Mat2 &Mat2::operator *= (Real s)
BartJanssens 0:785cff1e5a7c 221 {
BartJanssens 0:785cff1e5a7c 222 row[0] *= s;
BartJanssens 0:785cff1e5a7c 223 row[1] *= s;
BartJanssens 0:785cff1e5a7c 224
BartJanssens 0:785cff1e5a7c 225 return(SELF);
BartJanssens 0:785cff1e5a7c 226 }
BartJanssens 0:785cff1e5a7c 227
BartJanssens 0:785cff1e5a7c 228 inline Mat2 &Mat2::operator /= (Real s)
BartJanssens 0:785cff1e5a7c 229 {
BartJanssens 0:785cff1e5a7c 230 row[0] /= s;
BartJanssens 0:785cff1e5a7c 231 row[1] /= s;
BartJanssens 0:785cff1e5a7c 232
BartJanssens 0:785cff1e5a7c 233 return(SELF);
BartJanssens 0:785cff1e5a7c 234 }
BartJanssens 0:785cff1e5a7c 235
BartJanssens 0:785cff1e5a7c 236
BartJanssens 0:785cff1e5a7c 237 inline Mat2 Mat2::operator + (const Mat2 &m) const
BartJanssens 0:785cff1e5a7c 238 {
BartJanssens 0:785cff1e5a7c 239 Mat2 result;
BartJanssens 0:785cff1e5a7c 240
BartJanssens 0:785cff1e5a7c 241 result[0] = row[0] + m[0];
BartJanssens 0:785cff1e5a7c 242 result[1] = row[1] + m[1];
BartJanssens 0:785cff1e5a7c 243
BartJanssens 0:785cff1e5a7c 244 return(result);
BartJanssens 0:785cff1e5a7c 245 }
BartJanssens 0:785cff1e5a7c 246
BartJanssens 0:785cff1e5a7c 247 inline Mat2 Mat2::operator - (const Mat2 &m) const
BartJanssens 0:785cff1e5a7c 248 {
BartJanssens 0:785cff1e5a7c 249 Mat2 result;
BartJanssens 0:785cff1e5a7c 250
BartJanssens 0:785cff1e5a7c 251 result[0] = row[0] - m[0];
BartJanssens 0:785cff1e5a7c 252 result[1] = row[1] - m[1];
BartJanssens 0:785cff1e5a7c 253
BartJanssens 0:785cff1e5a7c 254 return(result);
BartJanssens 0:785cff1e5a7c 255 }
BartJanssens 0:785cff1e5a7c 256
BartJanssens 0:785cff1e5a7c 257 inline Mat2 Mat2::operator - () const
BartJanssens 0:785cff1e5a7c 258 {
BartJanssens 0:785cff1e5a7c 259 Mat2 result;
BartJanssens 0:785cff1e5a7c 260
BartJanssens 0:785cff1e5a7c 261 result[0] = -row[0];
BartJanssens 0:785cff1e5a7c 262 result[1] = -row[1];
BartJanssens 0:785cff1e5a7c 263
BartJanssens 0:785cff1e5a7c 264 return(result);
BartJanssens 0:785cff1e5a7c 265 }
BartJanssens 0:785cff1e5a7c 266
BartJanssens 0:785cff1e5a7c 267 inline Mat2 Mat2::operator * (const Mat2 &m) const
BartJanssens 0:785cff1e5a7c 268 {
BartJanssens 0:785cff1e5a7c 269 #define N(x,y) row[x][y]
BartJanssens 0:785cff1e5a7c 270 #define M(x,y) m.row[x][y]
BartJanssens 0:785cff1e5a7c 271 #define R(x,y) result[x][y]
BartJanssens 0:785cff1e5a7c 272
BartJanssens 0:785cff1e5a7c 273 Mat2 result;
BartJanssens 0:785cff1e5a7c 274
BartJanssens 0:785cff1e5a7c 275 R(0,0) = N(0,0) * M(0,0) + N(0,1) * M(1,0);
BartJanssens 0:785cff1e5a7c 276 R(0,1) = N(0,0) * M(0,1) + N(0,1) * M(1,1);
BartJanssens 0:785cff1e5a7c 277 R(1,0) = N(1,0) * M(0,0) + N(1,1) * M(1,0);
BartJanssens 0:785cff1e5a7c 278 R(1,1) = N(1,0) * M(0,1) + N(1,1) * M(1,1);
BartJanssens 0:785cff1e5a7c 279
BartJanssens 0:785cff1e5a7c 280 return(result);
BartJanssens 0:785cff1e5a7c 281
BartJanssens 0:785cff1e5a7c 282 #undef N
BartJanssens 0:785cff1e5a7c 283 #undef M
BartJanssens 0:785cff1e5a7c 284 #undef R
BartJanssens 0:785cff1e5a7c 285 }
BartJanssens 0:785cff1e5a7c 286
BartJanssens 0:785cff1e5a7c 287 inline Mat2 Mat2::operator * (Real s) const
BartJanssens 0:785cff1e5a7c 288 {
BartJanssens 0:785cff1e5a7c 289 Mat2 result;
BartJanssens 0:785cff1e5a7c 290
BartJanssens 0:785cff1e5a7c 291 result[0] = row[0] * s;
BartJanssens 0:785cff1e5a7c 292 result[1] = row[1] * s;
BartJanssens 0:785cff1e5a7c 293
BartJanssens 0:785cff1e5a7c 294 return(result);
BartJanssens 0:785cff1e5a7c 295 }
BartJanssens 0:785cff1e5a7c 296
BartJanssens 0:785cff1e5a7c 297 inline Mat2 Mat2::operator / (Real s) const
BartJanssens 0:785cff1e5a7c 298 {
BartJanssens 0:785cff1e5a7c 299 Mat2 result;
BartJanssens 0:785cff1e5a7c 300
BartJanssens 0:785cff1e5a7c 301 result[0] = row[0] / s;
BartJanssens 0:785cff1e5a7c 302 result[1] = row[1] / s;
BartJanssens 0:785cff1e5a7c 303
BartJanssens 0:785cff1e5a7c 304 return(result);
BartJanssens 0:785cff1e5a7c 305 }
BartJanssens 0:785cff1e5a7c 306
BartJanssens 0:785cff1e5a7c 307 inline Mat2 operator * (Real s, const Mat2 &m)
BartJanssens 0:785cff1e5a7c 308 {
BartJanssens 0:785cff1e5a7c 309 return(m * s);
BartJanssens 0:785cff1e5a7c 310 }
BartJanssens 0:785cff1e5a7c 311
BartJanssens 0:785cff1e5a7c 312 inline Vec2 operator * (const Mat2 &m, const Vec2 &v)
BartJanssens 0:785cff1e5a7c 313 {
BartJanssens 0:785cff1e5a7c 314 Vec2 result;
BartJanssens 0:785cff1e5a7c 315
BartJanssens 0:785cff1e5a7c 316 result[0] = m[0][0] * v[0] + m[0][1] * v[1];
BartJanssens 0:785cff1e5a7c 317 result[1] = m[1][0] * v[0] + m[1][1] * v[1];
BartJanssens 0:785cff1e5a7c 318
BartJanssens 0:785cff1e5a7c 319 return(result);
BartJanssens 0:785cff1e5a7c 320 }
BartJanssens 0:785cff1e5a7c 321
BartJanssens 0:785cff1e5a7c 322 inline Vec2 operator * (const Vec2 &v, const Mat2 &m)
BartJanssens 0:785cff1e5a7c 323 {
BartJanssens 0:785cff1e5a7c 324 Vec2 result;
BartJanssens 0:785cff1e5a7c 325
BartJanssens 0:785cff1e5a7c 326 result[0] = v[0] * m[0][0] + v[1] * m[1][0];
BartJanssens 0:785cff1e5a7c 327 result[1] = v[0] * m[0][1] + v[1] * m[1][1];
BartJanssens 0:785cff1e5a7c 328
BartJanssens 0:785cff1e5a7c 329 return(result);
BartJanssens 0:785cff1e5a7c 330 }
BartJanssens 0:785cff1e5a7c 331
BartJanssens 0:785cff1e5a7c 332 inline Vec2 &operator *= (Vec2 &v, const Mat2 &m)
BartJanssens 0:785cff1e5a7c 333 {
BartJanssens 0:785cff1e5a7c 334 Real t;
BartJanssens 0:785cff1e5a7c 335
BartJanssens 0:785cff1e5a7c 336 t = v[0] * m[0][0] + v[1] * m[1][0];
BartJanssens 0:785cff1e5a7c 337 v[1] = v[0] * m[0][1] + v[1] * m[1][1];
BartJanssens 0:785cff1e5a7c 338 v[0] = t;
BartJanssens 0:785cff1e5a7c 339
BartJanssens 0:785cff1e5a7c 340 return(v);
BartJanssens 0:785cff1e5a7c 341 }
BartJanssens 0:785cff1e5a7c 342
BartJanssens 0:785cff1e5a7c 343
BartJanssens 0:785cff1e5a7c 344 inline Mat2 trans(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 345 {
BartJanssens 0:785cff1e5a7c 346 Mat2 result;
BartJanssens 0:785cff1e5a7c 347
BartJanssens 0:785cff1e5a7c 348 result[0][0] = m[0][0]; result[0][1] = m[1][0];
BartJanssens 0:785cff1e5a7c 349 result[1][0] = m[0][1]; result[1][1] = m[1][1];
BartJanssens 0:785cff1e5a7c 350
BartJanssens 0:785cff1e5a7c 351 return(result);
BartJanssens 0:785cff1e5a7c 352 }
BartJanssens 0:785cff1e5a7c 353
BartJanssens 0:785cff1e5a7c 354 inline Real trace(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 355 {
BartJanssens 0:785cff1e5a7c 356 return(m[0][0] + m[1][1]);
BartJanssens 0:785cff1e5a7c 357 }
BartJanssens 0:785cff1e5a7c 358
BartJanssens 0:785cff1e5a7c 359 inline Mat2 adj(const Mat2 &m)
BartJanssens 0:785cff1e5a7c 360 {
BartJanssens 0:785cff1e5a7c 361 Mat2 result;
BartJanssens 0:785cff1e5a7c 362
BartJanssens 0:785cff1e5a7c 363 result[0] = cross(m[1]);
BartJanssens 0:785cff1e5a7c 364 result[1] = -cross(m[0]);
BartJanssens 0:785cff1e5a7c 365
BartJanssens 0:785cff1e5a7c 366 return(result);
BartJanssens 0:785cff1e5a7c 367 }
BartJanssens 0:785cff1e5a7c 368
BartJanssens 0:785cff1e5a7c 369 #ifdef VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 370 inline Vec2 xform(const Mat2 &m, const Vec2 &v)
BartJanssens 0:785cff1e5a7c 371 { return(v * m); }
BartJanssens 0:785cff1e5a7c 372 inline Mat2 xform(const Mat2 &m, const Mat2 &n)
BartJanssens 0:785cff1e5a7c 373 { return(n * m); }
BartJanssens 0:785cff1e5a7c 374 #else
BartJanssens 0:785cff1e5a7c 375 inline Vec2 xform(const Mat2 &m, const Vec2 &v)
BartJanssens 0:785cff1e5a7c 376 { return(m * v); }
BartJanssens 0:785cff1e5a7c 377 inline Mat2 xform(const Mat2 &m, const Mat2 &n)
BartJanssens 0:785cff1e5a7c 378 { return(m * n); }
BartJanssens 0:785cff1e5a7c 379 #endif
BartJanssens 0:785cff1e5a7c 380
BartJanssens 0:785cff1e5a7c 381 #endif