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: Mat4.h
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Defines a 4 x 4 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 __Mat4__
BartJanssens 0:785cff1e5a7c 12 #define __Mat4__
BartJanssens 0:785cff1e5a7c 13
BartJanssens 0:785cff1e5a7c 14 #include "Vec3.h"
BartJanssens 0:785cff1e5a7c 15 #include "Vec4.h"
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17
BartJanssens 0:785cff1e5a7c 18 // --- Mat4 Class -------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 19
BartJanssens 0:785cff1e5a7c 20 class Mat4
BartJanssens 0:785cff1e5a7c 21 {
BartJanssens 0:785cff1e5a7c 22 public:
BartJanssens 0:785cff1e5a7c 23
BartJanssens 0:785cff1e5a7c 24 // Constructors
BartJanssens 0:785cff1e5a7c 25
BartJanssens 0:785cff1e5a7c 26 Mat4();
BartJanssens 0:785cff1e5a7c 27 Mat4(Real a, Real b, Real c, Real d,
BartJanssens 0:785cff1e5a7c 28 Real e, Real f, Real g, Real h,
BartJanssens 0:785cff1e5a7c 29 Real i, Real j, Real k, Real l,
BartJanssens 0:785cff1e5a7c 30 Real m, Real n, Real o, Real p);
BartJanssens 0:785cff1e5a7c 31 Mat4(const Mat4 &m);
BartJanssens 0:785cff1e5a7c 32 Mat4(ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 33 Mat4(Block k);
BartJanssens 0:785cff1e5a7c 34
BartJanssens 0:785cff1e5a7c 35 // Accessor functions
BartJanssens 0:785cff1e5a7c 36
BartJanssens 0:785cff1e5a7c 37 Int Rows() const { return(4); };
BartJanssens 0:785cff1e5a7c 38 Int Cols() const { return(4); };
BartJanssens 0:785cff1e5a7c 39
BartJanssens 0:785cff1e5a7c 40 Vec4 &operator [] (Int i);
BartJanssens 0:785cff1e5a7c 41 const Vec4 &operator [] (Int i) const;
BartJanssens 0:785cff1e5a7c 42
BartJanssens 0:785cff1e5a7c 43 Real *Ref() const;
BartJanssens 0:785cff1e5a7c 44
BartJanssens 0:785cff1e5a7c 45 // Assignment operators
BartJanssens 0:785cff1e5a7c 46
BartJanssens 0:785cff1e5a7c 47 Mat4 &operator = (const Mat4 &m);
BartJanssens 0:785cff1e5a7c 48 Mat4 &operator = (ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 49 Mat4 &operator = (Block k);
BartJanssens 0:785cff1e5a7c 50 Mat4 &operator += (const Mat4 &m);
BartJanssens 0:785cff1e5a7c 51 Mat4 &operator -= (const Mat4 &m);
BartJanssens 0:785cff1e5a7c 52 Mat4 &operator *= (const Mat4 &m);
BartJanssens 0:785cff1e5a7c 53 Mat4 &operator *= (Real s);
BartJanssens 0:785cff1e5a7c 54 Mat4 &operator /= (Real s);
BartJanssens 0:785cff1e5a7c 55
BartJanssens 0:785cff1e5a7c 56 // Comparison operators
BartJanssens 0:785cff1e5a7c 57
BartJanssens 0:785cff1e5a7c 58 Bool operator == (const Mat4 &m) const; // M == N?
BartJanssens 0:785cff1e5a7c 59 Bool operator != (const Mat4 &m) const; // M != N?
BartJanssens 0:785cff1e5a7c 60
BartJanssens 0:785cff1e5a7c 61 // Arithmetic operators
BartJanssens 0:785cff1e5a7c 62
BartJanssens 0:785cff1e5a7c 63 Mat4 operator + (const Mat4 &m) const; // M + N
BartJanssens 0:785cff1e5a7c 64 Mat4 operator - (const Mat4 &m) const; // M - N
BartJanssens 0:785cff1e5a7c 65 Mat4 operator - () const; // -M
BartJanssens 0:785cff1e5a7c 66 Mat4 operator * (const Mat4 &m) const; // M * N
BartJanssens 0:785cff1e5a7c 67 Mat4 operator * (Real s) const; // M * s
BartJanssens 0:785cff1e5a7c 68 Mat4 operator / (Real s) const; // M / s
BartJanssens 0:785cff1e5a7c 69
BartJanssens 0:785cff1e5a7c 70 // Initialisers
BartJanssens 0:785cff1e5a7c 71
BartJanssens 0:785cff1e5a7c 72 Void MakeZero(); // Zero matrix
BartJanssens 0:785cff1e5a7c 73 Void MakeDiag(Real k = vl_one); // I
BartJanssens 0:785cff1e5a7c 74 Void MakeBlock(Real k = vl_one); // all elts = k
BartJanssens 0:785cff1e5a7c 75
BartJanssens 0:785cff1e5a7c 76 // Homogeneous Transforms
BartJanssens 0:785cff1e5a7c 77
BartJanssens 0:785cff1e5a7c 78 Mat4& MakeHRot(const Vec3 &axis, Real theta);
BartJanssens 0:785cff1e5a7c 79 // Rotate by theta radians about axis
BartJanssens 0:785cff1e5a7c 80 Mat4& MakeHRot(const Vec4 &q); // Rotate by quaternion
BartJanssens 0:785cff1e5a7c 81 Mat4& MakeHScale(const Vec3 &s); // Scale by components of s
BartJanssens 0:785cff1e5a7c 82
BartJanssens 0:785cff1e5a7c 83 Mat4& MakeHTrans(const Vec3 &t); // Translation by t
BartJanssens 0:785cff1e5a7c 84
BartJanssens 0:785cff1e5a7c 85 Mat4& Transpose(); // transpose in place
BartJanssens 0:785cff1e5a7c 86 Mat4& AddShift(const Vec3 &t); // Concatenate shift
BartJanssens 0:785cff1e5a7c 87
BartJanssens 0:785cff1e5a7c 88 // Private...
BartJanssens 0:785cff1e5a7c 89
BartJanssens 0:785cff1e5a7c 90 protected:
BartJanssens 0:785cff1e5a7c 91
BartJanssens 0:785cff1e5a7c 92 Vec4 row[4];
BartJanssens 0:785cff1e5a7c 93 };
BartJanssens 0:785cff1e5a7c 94
BartJanssens 0:785cff1e5a7c 95
BartJanssens 0:785cff1e5a7c 96 // --- Matrix operators -------------------------------------------------------
BartJanssens 0:785cff1e5a7c 97
BartJanssens 0:785cff1e5a7c 98 Vec4 operator * (const Mat4 &m, const Vec4 &v); // m * v
BartJanssens 0:785cff1e5a7c 99 Vec4 operator * (const Vec4 &v, const Mat4 &m); // v * m
BartJanssens 0:785cff1e5a7c 100 Vec4 &operator *= (Vec4 &a, const Mat4 &m); // v *= m
BartJanssens 0:785cff1e5a7c 101 inline Mat4 operator * (Real s, const Mat4 &m); // s * m
BartJanssens 0:785cff1e5a7c 102
BartJanssens 0:785cff1e5a7c 103 Mat4 trans(const Mat4 &m); // Transpose
BartJanssens 0:785cff1e5a7c 104 Real trace(const Mat4 &m); // Trace
BartJanssens 0:785cff1e5a7c 105 Mat4 adj(const Mat4 &m); // Adjoint
BartJanssens 0:785cff1e5a7c 106 Real det(const Mat4 &m); // Determinant
BartJanssens 0:785cff1e5a7c 107 Mat4 inv(const Mat4 &m); // Inverse
BartJanssens 0:785cff1e5a7c 108 Mat4 oprod(const Vec4 &a, const Vec4 &b);
BartJanssens 0:785cff1e5a7c 109 // 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 Vec4 xform(const Mat4 &m, const Vec4 &v); // Transform of v by m
BartJanssens 0:785cff1e5a7c 114 inline Vec3 xform(const Mat4 &m, const Vec3 &v); // Hom. xform of v by m
BartJanssens 0:785cff1e5a7c 115 inline Mat4 xform(const Mat4 &m, const Mat4 &n); // Xform v -> m(n(v))
BartJanssens 0:785cff1e5a7c 116
BartJanssens 0:785cff1e5a7c 117 //std::ostream &operator << (std::ostream &s, const Mat4 &m);
BartJanssens 0:785cff1e5a7c 118 //std::istream &operator >> (std::istream &s, Mat4 &m);
BartJanssens 0:785cff1e5a7c 119
BartJanssens 0:785cff1e5a7c 120 void printMat4(const Mat4 &m);
BartJanssens 0:785cff1e5a7c 121
BartJanssens 0:785cff1e5a7c 122 // --- Inlines ----------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 123
BartJanssens 0:785cff1e5a7c 124 inline Mat4::Mat4()
BartJanssens 0:785cff1e5a7c 125 {
BartJanssens 0:785cff1e5a7c 126 }
BartJanssens 0:785cff1e5a7c 127
BartJanssens 0:785cff1e5a7c 128 inline Vec4 &Mat4::operator [] (Int i)
BartJanssens 0:785cff1e5a7c 129 {
BartJanssens 0:785cff1e5a7c 130 CheckRange(i, 0, 4, "(Mat4::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 131 return(row[i]);
BartJanssens 0:785cff1e5a7c 132 }
BartJanssens 0:785cff1e5a7c 133
BartJanssens 0:785cff1e5a7c 134 inline const Vec4 &Mat4::operator [] (Int i) const
BartJanssens 0:785cff1e5a7c 135 {
BartJanssens 0:785cff1e5a7c 136 CheckRange(i, 0, 4, "(Mat4::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 137 return(row[i]);
BartJanssens 0:785cff1e5a7c 138 }
BartJanssens 0:785cff1e5a7c 139
BartJanssens 0:785cff1e5a7c 140 inline Real *Mat4::Ref() const
BartJanssens 0:785cff1e5a7c 141 {
BartJanssens 0:785cff1e5a7c 142 return((Real *) row);
BartJanssens 0:785cff1e5a7c 143 }
BartJanssens 0:785cff1e5a7c 144
BartJanssens 0:785cff1e5a7c 145 inline Mat4::Mat4(ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 146 {
BartJanssens 0:785cff1e5a7c 147 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 148 }
BartJanssens 0:785cff1e5a7c 149
BartJanssens 0:785cff1e5a7c 150 inline Mat4::Mat4(Block k)
BartJanssens 0:785cff1e5a7c 151 {
BartJanssens 0:785cff1e5a7c 152 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 153 }
BartJanssens 0:785cff1e5a7c 154
BartJanssens 0:785cff1e5a7c 155 inline Mat4 &Mat4::operator = (ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 156 {
BartJanssens 0:785cff1e5a7c 157 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 158
BartJanssens 0:785cff1e5a7c 159 return(SELF);
BartJanssens 0:785cff1e5a7c 160 }
BartJanssens 0:785cff1e5a7c 161
BartJanssens 0:785cff1e5a7c 162 inline Mat4 &Mat4::operator = (Block k)
BartJanssens 0:785cff1e5a7c 163 {
BartJanssens 0:785cff1e5a7c 164 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 165
BartJanssens 0:785cff1e5a7c 166 return(SELF);
BartJanssens 0:785cff1e5a7c 167 }
BartJanssens 0:785cff1e5a7c 168
BartJanssens 0:785cff1e5a7c 169 inline Mat4 operator * (Real s, const Mat4 &m)
BartJanssens 0:785cff1e5a7c 170 {
BartJanssens 0:785cff1e5a7c 171 return(m * s);
BartJanssens 0:785cff1e5a7c 172 }
BartJanssens 0:785cff1e5a7c 173
BartJanssens 0:785cff1e5a7c 174 #ifdef VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 175 inline Vec3 xform(const Mat4 &m, const Vec3 &v)
BartJanssens 0:785cff1e5a7c 176 { return(proj(Vec4(v, 1.0) * m)); }
BartJanssens 0:785cff1e5a7c 177 inline Vec4 xform(const Mat4 &m, const Vec4 &v)
BartJanssens 0:785cff1e5a7c 178 { return(v * m); }
BartJanssens 0:785cff1e5a7c 179 inline Mat4 xform(const Mat4 &m, const Mat4 &n)
BartJanssens 0:785cff1e5a7c 180 { return(n * m); }
BartJanssens 0:785cff1e5a7c 181 #else
BartJanssens 0:785cff1e5a7c 182 inline Vec3 xform(const Mat4 &m, const Vec3 &v)
BartJanssens 0:785cff1e5a7c 183 { return(proj(m * Vec4(v, 1.0))); }
BartJanssens 0:785cff1e5a7c 184 inline Vec4 xform(const Mat4 &m, const Vec4 &v)
BartJanssens 0:785cff1e5a7c 185 { return(m * v); }
BartJanssens 0:785cff1e5a7c 186 inline Mat4 xform(const Mat4 &m, const Mat4 &n)
BartJanssens 0:785cff1e5a7c 187 { return(m * n); }
BartJanssens 0:785cff1e5a7c 188 #endif
BartJanssens 0:785cff1e5a7c 189
BartJanssens 0:785cff1e5a7c 190 #endif