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: Mat3.h
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Defines a 3 x 3 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 __Mat3__
BartJanssens 0:785cff1e5a7c 12 #define __Mat3__
BartJanssens 0:785cff1e5a7c 13
BartJanssens 0:785cff1e5a7c 14 #include "Vec3.h"
BartJanssens 0:785cff1e5a7c 15
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17 // --- Mat3 Class -------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 18
BartJanssens 0:785cff1e5a7c 19
BartJanssens 0:785cff1e5a7c 20 class Vec4;
BartJanssens 0:785cff1e5a7c 21
BartJanssens 0:785cff1e5a7c 22 class Mat3
BartJanssens 0:785cff1e5a7c 23 {
BartJanssens 0:785cff1e5a7c 24 public:
BartJanssens 0:785cff1e5a7c 25
BartJanssens 0:785cff1e5a7c 26 // Constructors
BartJanssens 0:785cff1e5a7c 27
BartJanssens 0:785cff1e5a7c 28 Mat3();
BartJanssens 0:785cff1e5a7c 29 Mat3(Real a, Real b, Real c,
BartJanssens 0:785cff1e5a7c 30 Real d, Real e, Real f,
BartJanssens 0:785cff1e5a7c 31 Real g, Real h, Real i);
BartJanssens 0:785cff1e5a7c 32 Mat3(const Mat3 &m);
BartJanssens 0:785cff1e5a7c 33 Mat3(ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 34 Mat3(Block k);
BartJanssens 0:785cff1e5a7c 35
BartJanssens 0:785cff1e5a7c 36 // Accessor functions
BartJanssens 0:785cff1e5a7c 37
BartJanssens 0:785cff1e5a7c 38 Int Rows() const { return(3); };
BartJanssens 0:785cff1e5a7c 39 Int Cols() const { return(3); };
BartJanssens 0:785cff1e5a7c 40
BartJanssens 0:785cff1e5a7c 41 Vec3 &operator [] (Int i);
BartJanssens 0:785cff1e5a7c 42 const Vec3 &operator [] (Int i) const;
BartJanssens 0:785cff1e5a7c 43
BartJanssens 0:785cff1e5a7c 44 Real *Ref() const; // Return pointer to data
BartJanssens 0:785cff1e5a7c 45
BartJanssens 0:785cff1e5a7c 46 // Assignment operators
BartJanssens 0:785cff1e5a7c 47
BartJanssens 0:785cff1e5a7c 48 Mat3 &operator = (const Mat3 &m);
BartJanssens 0:785cff1e5a7c 49 Mat3 &operator = (ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 50 Mat3 &operator = (Block k);
BartJanssens 0:785cff1e5a7c 51 Mat3 &operator += (const Mat3 &m);
BartJanssens 0:785cff1e5a7c 52 Mat3 &operator -= (const Mat3 &m);
BartJanssens 0:785cff1e5a7c 53 Mat3 &operator *= (const Mat3 &m);
BartJanssens 0:785cff1e5a7c 54 Mat3 &operator *= (Real s);
BartJanssens 0:785cff1e5a7c 55 Mat3 &operator /= (Real s);
BartJanssens 0:785cff1e5a7c 56
BartJanssens 0:785cff1e5a7c 57 // Comparison operators
BartJanssens 0:785cff1e5a7c 58
BartJanssens 0:785cff1e5a7c 59 Bool operator == (const Mat3 &m) const; // M == N?
BartJanssens 0:785cff1e5a7c 60 Bool operator != (const Mat3 &m) const; // M != N?
BartJanssens 0:785cff1e5a7c 61
BartJanssens 0:785cff1e5a7c 62 // Arithmetic operators
BartJanssens 0:785cff1e5a7c 63
BartJanssens 0:785cff1e5a7c 64 Mat3 operator + (const Mat3 &m) const; // M + N
BartJanssens 0:785cff1e5a7c 65 Mat3 operator - (const Mat3 &m) const; // M - N
BartJanssens 0:785cff1e5a7c 66 Mat3 operator - () const; // -M
BartJanssens 0:785cff1e5a7c 67 Mat3 operator * (const Mat3 &m) const; // M * N
BartJanssens 0:785cff1e5a7c 68 Mat3 operator * (Real s) const; // M * s
BartJanssens 0:785cff1e5a7c 69 Mat3 operator / (Real s) const; // M / s
BartJanssens 0:785cff1e5a7c 70
BartJanssens 0:785cff1e5a7c 71 // Initialisers
BartJanssens 0:785cff1e5a7c 72
BartJanssens 0:785cff1e5a7c 73 Void MakeZero(); // Zero matrix
BartJanssens 0:785cff1e5a7c 74 Void MakeDiag(Real k = vl_one); // I
BartJanssens 0:785cff1e5a7c 75 Void MakeBlock(Real k = vl_one); // all elts = k
BartJanssens 0:785cff1e5a7c 76
BartJanssens 0:785cff1e5a7c 77 // Vector Transforms
BartJanssens 0:785cff1e5a7c 78
BartJanssens 0:785cff1e5a7c 79 Mat3& MakeRot(const Vec3 &axis, Real theta);
BartJanssens 0:785cff1e5a7c 80 Mat3& MakeRot(const Vec4 &q); // Rotate by quaternion
BartJanssens 0:785cff1e5a7c 81 Mat3& MakeScale(const Vec3 &s);
BartJanssens 0:785cff1e5a7c 82
BartJanssens 0:785cff1e5a7c 83 // Homogeneous Transforms
BartJanssens 0:785cff1e5a7c 84
BartJanssens 0:785cff1e5a7c 85 Mat3& MakeHRot(Real theta); // Rotate by theta rads
BartJanssens 0:785cff1e5a7c 86 Mat3& MakeHScale(const Vec2 &s); // Scale by s
BartJanssens 0:785cff1e5a7c 87 Mat3& MakeHTrans(const Vec2 &t); // Translation by t
BartJanssens 0:785cff1e5a7c 88
BartJanssens 0:785cff1e5a7c 89 // Private...
BartJanssens 0:785cff1e5a7c 90
BartJanssens 0:785cff1e5a7c 91 protected:
BartJanssens 0:785cff1e5a7c 92
BartJanssens 0:785cff1e5a7c 93 Vec3 row[3];
BartJanssens 0:785cff1e5a7c 94 };
BartJanssens 0:785cff1e5a7c 95
BartJanssens 0:785cff1e5a7c 96
BartJanssens 0:785cff1e5a7c 97 // --- Matrix operators -------------------------------------------------------
BartJanssens 0:785cff1e5a7c 98
BartJanssens 0:785cff1e5a7c 99 inline Vec3 &operator *= (Vec3 &v, const Mat3 &m); // v *= m
BartJanssens 0:785cff1e5a7c 100 inline Vec3 operator * (const Mat3 &m, const Vec3 &v); // m * v
BartJanssens 0:785cff1e5a7c 101 inline Vec3 operator * (const Vec3 &v, const Mat3 &m); // v * m
BartJanssens 0:785cff1e5a7c 102 inline Mat3 operator * (const Real s, const Mat3 &m); // s * m
BartJanssens 0:785cff1e5a7c 103
BartJanssens 0:785cff1e5a7c 104 Mat3 trans(const Mat3 &m); // Transpose
BartJanssens 0:785cff1e5a7c 105 Real trace(const Mat3 &m); // Trace
BartJanssens 0:785cff1e5a7c 106 Mat3 adj(const Mat3 &m); // Adjoint
BartJanssens 0:785cff1e5a7c 107 Real det(const Mat3 &m); // Determinant
BartJanssens 0:785cff1e5a7c 108 Mat3 inv(const Mat3 &m); // Inverse
BartJanssens 0:785cff1e5a7c 109 Mat3 oprod(const Vec3 &a, const Vec3 &b); // Outer product
BartJanssens 0:785cff1e5a7c 110
BartJanssens 0:785cff1e5a7c 111 // The xform functions help avoid dependence on whether row or column
BartJanssens 0:785cff1e5a7c 112 // vectors are used to represent points and vectors.
BartJanssens 0:785cff1e5a7c 113 inline Vec3 xform(const Mat3 &m, const Vec3 &v); // Transform of v by m
BartJanssens 0:785cff1e5a7c 114 inline Vec2 xform(const Mat3 &m, const Vec2 &v); // Hom. xform of v by m
BartJanssens 0:785cff1e5a7c 115 inline Mat3 xform(const Mat3 &m, const Mat3 &n); // Xform v -> m(n(v))
BartJanssens 0:785cff1e5a7c 116
BartJanssens 0:785cff1e5a7c 117 //std::ostream &operator << (std::ostream &s, const Mat3 &m);
BartJanssens 0:785cff1e5a7c 118 //std::istream &operator >> (std::istream &s, Mat3 &m);
BartJanssens 0:785cff1e5a7c 119
BartJanssens 0:785cff1e5a7c 120 void printMat3(const Mat3 &m);
BartJanssens 0:785cff1e5a7c 121
BartJanssens 0:785cff1e5a7c 122
BartJanssens 0:785cff1e5a7c 123 // --- Inlines ----------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 124
BartJanssens 0:785cff1e5a7c 125 inline Mat3::Mat3()
BartJanssens 0:785cff1e5a7c 126 {
BartJanssens 0:785cff1e5a7c 127 }
BartJanssens 0:785cff1e5a7c 128
BartJanssens 0:785cff1e5a7c 129 inline Vec3 &Mat3::operator [] (Int i)
BartJanssens 0:785cff1e5a7c 130 {
BartJanssens 0:785cff1e5a7c 131 CheckRange(i, 0, 3, "(Mat3::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 132 return(row[i]);
BartJanssens 0:785cff1e5a7c 133 }
BartJanssens 0:785cff1e5a7c 134
BartJanssens 0:785cff1e5a7c 135 inline const Vec3 &Mat3::operator [] (Int i) const
BartJanssens 0:785cff1e5a7c 136 {
BartJanssens 0:785cff1e5a7c 137 CheckRange(i, 0, 3, "(Mat3::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 138 return(row[i]);
BartJanssens 0:785cff1e5a7c 139 }
BartJanssens 0:785cff1e5a7c 140
BartJanssens 0:785cff1e5a7c 141 inline Real *Mat3::Ref() const
BartJanssens 0:785cff1e5a7c 142 {
BartJanssens 0:785cff1e5a7c 143 return((Real *) row);
BartJanssens 0:785cff1e5a7c 144 }
BartJanssens 0:785cff1e5a7c 145
BartJanssens 0:785cff1e5a7c 146 inline Mat3::Mat3(ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 147 {
BartJanssens 0:785cff1e5a7c 148 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 149 }
BartJanssens 0:785cff1e5a7c 150
BartJanssens 0:785cff1e5a7c 151 inline Mat3::Mat3(Block k)
BartJanssens 0:785cff1e5a7c 152 {
BartJanssens 0:785cff1e5a7c 153 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 154 }
BartJanssens 0:785cff1e5a7c 155
BartJanssens 0:785cff1e5a7c 156 inline Mat3 &Mat3::operator = (ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 157 {
BartJanssens 0:785cff1e5a7c 158 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 159
BartJanssens 0:785cff1e5a7c 160 return(SELF);
BartJanssens 0:785cff1e5a7c 161 }
BartJanssens 0:785cff1e5a7c 162
BartJanssens 0:785cff1e5a7c 163 inline Mat3 &Mat3::operator = (Block k)
BartJanssens 0:785cff1e5a7c 164 {
BartJanssens 0:785cff1e5a7c 165 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 166
BartJanssens 0:785cff1e5a7c 167 return(SELF);
BartJanssens 0:785cff1e5a7c 168 }
BartJanssens 0:785cff1e5a7c 169
BartJanssens 0:785cff1e5a7c 170 inline Mat3 operator * (const Real s, const Mat3 &m)
BartJanssens 0:785cff1e5a7c 171 {
BartJanssens 0:785cff1e5a7c 172 return(m * s);
BartJanssens 0:785cff1e5a7c 173 }
BartJanssens 0:785cff1e5a7c 174
BartJanssens 0:785cff1e5a7c 175 inline Vec3 operator * (const Mat3 &m, const Vec3 &v)
BartJanssens 0:785cff1e5a7c 176 {
BartJanssens 0:785cff1e5a7c 177 Vec3 result;
BartJanssens 0:785cff1e5a7c 178
BartJanssens 0:785cff1e5a7c 179 result[0] = v[0] * m[0][0] + v[1] * m[0][1] + v[2] * m[0][2];
BartJanssens 0:785cff1e5a7c 180 result[1] = v[0] * m[1][0] + v[1] * m[1][1] + v[2] * m[1][2];
BartJanssens 0:785cff1e5a7c 181 result[2] = v[0] * m[2][0] + v[1] * m[2][1] + v[2] * m[2][2];
BartJanssens 0:785cff1e5a7c 182
BartJanssens 0:785cff1e5a7c 183 return(result);
BartJanssens 0:785cff1e5a7c 184 }
BartJanssens 0:785cff1e5a7c 185
BartJanssens 0:785cff1e5a7c 186 inline Vec3 operator * (const Vec3 &v, const Mat3 &m)
BartJanssens 0:785cff1e5a7c 187 {
BartJanssens 0:785cff1e5a7c 188 Vec3 result;
BartJanssens 0:785cff1e5a7c 189
BartJanssens 0:785cff1e5a7c 190 result[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
BartJanssens 0:785cff1e5a7c 191 result[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
BartJanssens 0:785cff1e5a7c 192 result[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
BartJanssens 0:785cff1e5a7c 193
BartJanssens 0:785cff1e5a7c 194 return(result);
BartJanssens 0:785cff1e5a7c 195 }
BartJanssens 0:785cff1e5a7c 196
BartJanssens 0:785cff1e5a7c 197 inline Vec3 &operator *= (Vec3 &v, const Mat3 &m)
BartJanssens 0:785cff1e5a7c 198 {
BartJanssens 0:785cff1e5a7c 199 Real t0, t1;
BartJanssens 0:785cff1e5a7c 200
BartJanssens 0:785cff1e5a7c 201 t0 = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
BartJanssens 0:785cff1e5a7c 202 t1 = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
BartJanssens 0:785cff1e5a7c 203 v[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
BartJanssens 0:785cff1e5a7c 204 v[0] = t0;
BartJanssens 0:785cff1e5a7c 205 v[1] = t1;
BartJanssens 0:785cff1e5a7c 206
BartJanssens 0:785cff1e5a7c 207 return(v);
BartJanssens 0:785cff1e5a7c 208 }
BartJanssens 0:785cff1e5a7c 209
BartJanssens 0:785cff1e5a7c 210 #ifdef VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 211 inline Vec2 xform(const Mat3 &m, const Vec2 &v)
BartJanssens 0:785cff1e5a7c 212 { return(proj(Vec3(v, 1.0) * m)); }
BartJanssens 0:785cff1e5a7c 213 inline Vec3 xform(const Mat3 &m, const Vec3 &v)
BartJanssens 0:785cff1e5a7c 214 { return(v * m); }
BartJanssens 0:785cff1e5a7c 215 inline Mat3 xform(const Mat3 &m, const Mat3 &n)
BartJanssens 0:785cff1e5a7c 216 { return(n * m); }
BartJanssens 0:785cff1e5a7c 217 #else
BartJanssens 0:785cff1e5a7c 218 inline Vec2 xform(const Mat3 &m, const Vec2 &v)
BartJanssens 0:785cff1e5a7c 219 { return(proj(m * Vec3(v, 1.0))); }
BartJanssens 0:785cff1e5a7c 220 inline Vec3 xform(const Mat3 &m, const Vec3 &v)
BartJanssens 0:785cff1e5a7c 221 { return(m * v); }
BartJanssens 0:785cff1e5a7c 222 inline Mat3 xform(const Mat3 &m, const Mat3 &n)
BartJanssens 0:785cff1e5a7c 223 { return(m * n); }
BartJanssens 0:785cff1e5a7c 224 #endif
BartJanssens 0:785cff1e5a7c 225
BartJanssens 0:785cff1e5a7c 226 #endif