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

Mat3.h

Committer:
BartJanssens
Date:
2016-01-04
Revision:
0:785cff1e5a7c

File content as of revision 0:785cff1e5a7c:

/*
    File:           Mat3.h

    Function:       Defines a 3 x 3 matrix.

    Author(s):      Andrew Willmott

    Copyright:      (c) 1995-2001, Andrew Willmott
*/

#ifndef __Mat3__
#define __Mat3__

#include "Vec3.h"


// --- Mat3 Class -------------------------------------------------------------


class Vec4;

class Mat3
{
public:

    // Constructors

                Mat3();
                Mat3(Real a, Real b, Real c,
                     Real d, Real e, Real f,
                     Real g, Real h, Real i);
                Mat3(const Mat3 &m);
                Mat3(ZeroOrOne k);
                Mat3(Block k);

    // Accessor functions

    Int         Rows() const { return(3); };
    Int         Cols() const { return(3); };

    Vec3        &operator [] (Int i);
    const Vec3  &operator [] (Int i) const;

    Real        *Ref() const;               // Return pointer to data

    // Assignment operators

    Mat3        &operator =  (const Mat3 &m);
    Mat3        &operator =  (ZeroOrOne k);
    Mat3        &operator =  (Block k);
    Mat3        &operator += (const Mat3 &m);
    Mat3        &operator -= (const Mat3 &m);
    Mat3        &operator *= (const Mat3 &m);
    Mat3        &operator *= (Real s);
    Mat3        &operator /= (Real s);

    // Comparison operators

    Bool        operator == (const Mat3 &m) const;  // M == N?
    Bool        operator != (const Mat3 &m) const;  // M != N?

    // Arithmetic operators

    Mat3        operator + (const Mat3 &m) const;   // M + N
    Mat3        operator - (const Mat3 &m) const;   // M - N
    Mat3        operator - () const;                // -M
    Mat3        operator * (const Mat3 &m) const;   // M * N
    Mat3        operator * (Real s) const;          // M * s
    Mat3        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

    // Vector Transforms

    Mat3&       MakeRot(const Vec3 &axis, Real theta);
    Mat3&       MakeRot(const Vec4 &q);     // Rotate by quaternion
    Mat3&       MakeScale(const Vec3 &s);

    // Homogeneous Transforms

    Mat3&       MakeHRot(Real theta);       // Rotate by theta rads
    Mat3&       MakeHScale(const Vec2 &s);  // Scale by s
    Mat3&       MakeHTrans(const Vec2 &t);  // Translation by t

    // Private...

protected:

    Vec3        row[3];
};


// --- Matrix operators -------------------------------------------------------

inline Vec3     &operator *= (Vec3 &v, const Mat3 &m);      // v *= m
inline Vec3     operator * (const Mat3 &m, const Vec3 &v);  // m * v
inline Vec3     operator * (const Vec3 &v, const Mat3 &m);  // v * m
inline Mat3     operator * (const Real s, const Mat3 &m);   // s * m

Mat3            trans(const Mat3 &m);                   // Transpose
Real            trace(const Mat3 &m);                   // Trace
Mat3            adj(const Mat3 &m);                     // Adjoint
Real            det(const Mat3 &m);                     // Determinant
Mat3            inv(const Mat3 &m);                     // Inverse
Mat3            oprod(const Vec3 &a, const Vec3 &b);    // Outer product

// The xform functions help avoid dependence on whether row or column
// vectors are used to represent points and vectors.
inline Vec3     xform(const Mat3 &m, const Vec3 &v); // Transform of v by m
inline Vec2     xform(const Mat3 &m, const Vec2 &v); // Hom. xform of v by m
inline Mat3     xform(const Mat3 &m, const Mat3 &n); // Xform v -> m(n(v))

//std::ostream         &operator << (std::ostream &s, const Mat3 &m);
//std::istream         &operator >> (std::istream &s, Mat3 &m);

void printMat3(const Mat3 &m);


// --- Inlines ----------------------------------------------------------------

inline Mat3::Mat3()
{
}

inline Vec3 &Mat3::operator [] (Int i)
{
    CheckRange(i, 0, 3, "(Mat3::[i]) index out of range");
    return(row[i]);
}

inline const Vec3 &Mat3::operator [] (Int i) const
{
    CheckRange(i, 0, 3, "(Mat3::[i]) index out of range");
    return(row[i]);
}

inline Real *Mat3::Ref() const
{
    return((Real *) row);
}

inline Mat3::Mat3(ZeroOrOne k)
{
    MakeDiag(k);
}

inline Mat3::Mat3(Block k)
{
    MakeBlock((ZeroOrOne) k);
}

inline Mat3 &Mat3::operator = (ZeroOrOne k)
{
    MakeDiag(k);

    return(SELF);
}

inline Mat3 &Mat3::operator = (Block k)
{
    MakeBlock((ZeroOrOne) k);

    return(SELF);
}

inline Mat3 operator *  (const Real s, const Mat3 &m)
{
    return(m * s);
}

inline Vec3 operator * (const Mat3 &m, const Vec3 &v)
{
    Vec3 result;

    result[0] = v[0] * m[0][0] + v[1] * m[0][1] + v[2] * m[0][2];
    result[1] = v[0] * m[1][0] + v[1] * m[1][1] + v[2] * m[1][2];
    result[2] = v[0] * m[2][0] + v[1] * m[2][1] + v[2] * m[2][2];

    return(result);
}

inline Vec3 operator * (const Vec3 &v, const Mat3 &m)
{
    Vec3 result;

    result[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
    result[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
    result[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];

    return(result);
}

inline Vec3 &operator *= (Vec3 &v, const Mat3 &m)
{
    Real t0, t1;

    t0   = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
    t1   = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
    v[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
    v[0] = t0;
    v[1] = t1;

    return(v);
}

#ifdef VL_ROW_ORIENT
inline Vec2 xform(const Mat3 &m, const Vec2 &v)
{ return(proj(Vec3(v, 1.0) * m)); }
inline Vec3 xform(const Mat3 &m, const Vec3 &v)
{ return(v * m); }
inline Mat3 xform(const Mat3 &m, const Mat3 &n)
{ return(n * m); }
#else
inline Vec2 xform(const Mat3 &m, const Vec2 &v)
{ return(proj(m * Vec3(v, 1.0))); }
inline Vec3 xform(const Mat3 &m, const Vec3 &v)
{ return(m * v); }
inline Mat3 xform(const Mat3 &m, const Mat3 &n)
{ return(m * n); }
#endif

#endif