Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Mat4.h
- Committer:
- BartJanssens
- Date:
- 2016-01-05
- Revision:
- 1:e25ff4b06ed2
- Parent:
- 0:785cff1e5a7c
File content as of revision 1:e25ff4b06ed2:
/* File: Mat4.h Function: Defines a 4 x 4 matrix. Author(s): Andrew Willmott Copyright: (c) 1995-2001, Andrew Willmott */ #ifndef __Mat4__ #define __Mat4__ #include "Vec3.h" #include "Vec4.h" // --- Mat4 Class ------------------------------------------------------------- class Mat4 { public: // Constructors Mat4(); Mat4(Real a, Real b, Real c, Real d, Real e, Real f, Real g, Real h, Real i, Real j, Real k, Real l, Real m, Real n, Real o, Real p); Mat4(const Mat4 &m); Mat4(ZeroOrOne k); Mat4(Block k); // Accessor functions Int Rows() const { return(4); }; Int Cols() const { return(4); }; Vec4 &operator [] (Int i); const Vec4 &operator [] (Int i) const; Real *Ref() const; // Assignment operators Mat4 &operator = (const Mat4 &m); Mat4 &operator = (ZeroOrOne k); Mat4 &operator = (Block k); Mat4 &operator += (const Mat4 &m); Mat4 &operator -= (const Mat4 &m); Mat4 &operator *= (const Mat4 &m); Mat4 &operator *= (Real s); Mat4 &operator /= (Real s); // Comparison operators Bool operator == (const Mat4 &m) const; // M == N? Bool operator != (const Mat4 &m) const; // M != N? // Arithmetic operators Mat4 operator + (const Mat4 &m) const; // M + N Mat4 operator - (const Mat4 &m) const; // M - N Mat4 operator - () const; // -M Mat4 operator * (const Mat4 &m) const; // M * N Mat4 operator * (Real s) const; // M * s Mat4 operator / (Real s) const; // M / s // Initialisers Void MakeZero(); // Zero matrix Void MakeDiag(Real k = vl_one); // I Void MakeBlock(Real k = vl_one); // all elts = k // Homogeneous Transforms Mat4& MakeHRot(const Vec3 &axis, Real theta); // Rotate by theta radians about axis Mat4& MakeHRot(const Vec4 &q); // Rotate by quaternion Mat4& MakeHScale(const Vec3 &s); // Scale by components of s Mat4& MakeHTrans(const Vec3 &t); // Translation by t Mat4& Transpose(); // transpose in place Mat4& AddShift(const Vec3 &t); // Concatenate shift // Private... protected: Vec4 row[4]; }; // --- Matrix operators ------------------------------------------------------- Vec4 operator * (const Mat4 &m, const Vec4 &v); // m * v Vec4 operator * (const Vec4 &v, const Mat4 &m); // v * m Vec4 &operator *= (Vec4 &a, const Mat4 &m); // v *= m inline Mat4 operator * (Real s, const Mat4 &m); // s * m Mat4 trans(const Mat4 &m); // Transpose Real trace(const Mat4 &m); // Trace Mat4 adj(const Mat4 &m); // Adjoint Real det(const Mat4 &m); // Determinant Mat4 inv(const Mat4 &m); // Inverse Mat4 oprod(const Vec4 &a, const Vec4 &b); // Outer product // The xform functions help avoid dependence on whether row or column // vectors are used to represent points and vectors. inline Vec4 xform(const Mat4 &m, const Vec4 &v); // Transform of v by m inline Vec3 xform(const Mat4 &m, const Vec3 &v); // Hom. xform of v by m inline Mat4 xform(const Mat4 &m, const Mat4 &n); // Xform v -> m(n(v)) //std::ostream &operator << (std::ostream &s, const Mat4 &m); //std::istream &operator >> (std::istream &s, Mat4 &m); void printMat4(const Mat4 &m); // --- Inlines ---------------------------------------------------------------- inline Mat4::Mat4() { } inline Vec4 &Mat4::operator [] (Int i) { CheckRange(i, 0, 4, "(Mat4::[i]) index out of range"); return(row[i]); } inline const Vec4 &Mat4::operator [] (Int i) const { CheckRange(i, 0, 4, "(Mat4::[i]) index out of range"); return(row[i]); } inline Real *Mat4::Ref() const { return((Real *) row); } inline Mat4::Mat4(ZeroOrOne k) { MakeDiag(k); } inline Mat4::Mat4(Block k) { MakeBlock((ZeroOrOne) k); } inline Mat4 &Mat4::operator = (ZeroOrOne k) { MakeDiag(k); return(SELF); } inline Mat4 &Mat4::operator = (Block k) { MakeBlock((ZeroOrOne) k); return(SELF); } inline Mat4 operator * (Real s, const Mat4 &m) { return(m * s); } #ifdef VL_ROW_ORIENT inline Vec3 xform(const Mat4 &m, const Vec3 &v) { return(proj(Vec4(v, 1.0) * m)); } inline Vec4 xform(const Mat4 &m, const Vec4 &v) { return(v * m); } inline Mat4 xform(const Mat4 &m, const Mat4 &n) { return(n * m); } #else inline Vec3 xform(const Mat4 &m, const Vec3 &v) { return(proj(m * Vec4(v, 1.0))); } inline Vec4 xform(const Mat4 &m, const Vec4 &v) { return(m * v); } inline Mat4 xform(const Mat4 &m, const Mat4 &n) { return(m * n); } #endif #endif