matrixlib.h

 #include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

struct Matrix
{
  float e[16];             

  inline float& operator[](int index) {return e[index];}
  inline const float& operator[](int index) const {return e[index];}
};

struct Vector
{
  float e[4];             

  inline float& operator[](int index) {return e[index];}
  inline const float& operator[](int index) const {return e[index];}
};

ostream& operator<<(ostream& out, Matrix &m);
ostream& operator<<(ostream& out, Vector &v);

Matrix buildidentitymatrix(void);
Matrix buildrotationmatrix(float theta, float x, float y, float z);
Matrix buildscalematrix(float x, float y, float z);
Matrix buildtranslationmatrix(float x, float y, float z);

Vector buildvector(float x, float y, float z);

Matrix operator*(const Matrix &a, const Matrix &b);
void operator*=(Matrix &a, const Matrix &b);
Vector operator*(const Matrix &a, const Vector &v);

ostream& operator<<(ostream& out, const Matrix &m)
{
  out << m[0] << " " << m[4] << " " <<  m[8] << " " <<  m[12] << endl;
  out << m[1] << " " <<  m[5] << " " <<  m[9] << " " <<  m[13] << endl;
  out << m[2] << " " <<  m[6] << " " <<  m[10] << " " <<  m[14] << endl;
  out << m[3] << " " <<  m[7] << " " <<  m[11] << " " <<  m[15];
  return out;        
}

ostream& operator<<(ostream& out, Vector &v)
{
  out << "(" << v[0] << ", " << v[1] << ", " <<  v[2] << ")";
  return out;        
}

Matrix buildidentitymatrix(void)
{
  Matrix m;      
  m[0] = 1;
  m[1] = 0;
  m[2] = 0;
  m[3] = 0;

  m[4] = 0;
  m[5] = 1;
  m[6] = 0;
  m[7] = 0;

  m[8] = 0;
  m[9] = 0;
  m[10] = 1;
  m[11] = 0;

  m[12] = 0;
  m[13] = 0;
  m[14] = 0;
  m[15] = 1;    

  return m;
}

Matrix buildrotationmatrix(float theta, float x, float y, float z)
{
  Matrix m;      
  float c = cos(theta);
  float s = sin(theta);
  float t = 1 - cos(theta);    
  m[0] = t*x*x + c;
  m[1] = t*x*y + s*z;
  m[2] = t*x*z - s*y;
  m[3] = 0;
    
  m[4] = t*x*y - s*z;
  m[5] = t*y*y + c;
  m[6] = t*y*z + s*x;
  m[7] = 0;

  m[8] = t*x*z + s*y;
  m[9] = t*y*z - s*x;
  m[10] = t*z*z + c;
  m[11] = 0;

  m[12] = 0;
  m[13] = 0;
  m[14] = 0;
  m[15] = 1;         

  return m;
}

Matrix buildscalematrix(float x, float y, float z)
{
  Matrix m;    
    
  m[0] = x;
  m[1] = 0;
  m[2] = 0;
  m[3] = 0;

  m[4] = 0;
  m[5] = y;
  m[6] = 0;
  m[7] = 0;

  m[8] = 0;
  m[9] = 0;
  m[10] = z;
  m[11] = 0;

  m[12] = 0;
  m[13] = 0;
  m[14] = 0;
  m[15] = 1;    

  return m;
}

Matrix buildtranslationmatrix(float x, float y, float z)
{
  Matrix m;
  m[0] = 1;
  m[1] = 0;
  m[2] = 0;
  m[3] = 0;

  m[4] = 0;
  m[5] = 1;
  m[6] = 0;
  m[7] = 0;

  m[8] = 0;
  m[9] = 0;
  m[10] = 1;
  m[11] = 0;

  m[12] = x;
  m[13] = y;
  m[14] = z;
  m[15] = 1;    
  return m;
}

Matrix operator*(const Matrix &a, const Matrix &b)
{   
  Matrix m;    

  m[0] = b[0]*a[0] + b[1]*a[4] + b[2]*a[8] + b[3]*a[12];
  m[1] = b[0]*a[1] + b[1]*a[5] + b[2]*a[9] + b[3]*a[13];
  m[2] = b[0]*a[2] + b[1]*a[6] + b[2]*a[10] + b[3]*a[14];
  m[3] = b[0]*a[3] + b[1]*a[7] + b[2]*a[11] + b[3]*a[15];

  m[4] = b[4]*a[0] + b[5]*a[4] + b[6]*a[8] + b[7]*a[12];
  m[5] = b[4]*a[1] + b[5]*a[5] + b[6]*a[9] + b[7]*a[13];
  m[6] = b[4]*a[2] + b[5]*a[6] + b[6]*a[10] + b[7]*a[14];
  m[7] = b[4]*a[3] + b[5]*a[7] + b[6]*a[11] + b[7]*a[15];

  m[8] = b[8]*a[0] + b[9]*a[4] + b[10]*a[8] + b[11]*a[12];
  m[9] = b[8]*a[1] + b[9]*a[5] + b[10]*a[9] + b[11]*a[13];
  m[10] = b[8]*a[2] + b[9]*a[6] + b[10]*a[10] + b[11]*a[14];
  m[11] = b[8]*a[3] + b[9]*a[7] + b[10]*a[11] + b[11]*a[15];

  m[12] = b[12]*a[0] + b[13]*a[4] + b[14]*a[8] + b[15]*a[12];
  m[13] = b[12]*a[1] + b[13]*a[5] + b[14]*a[9] + b[15]*a[13];
  m[14] = b[12]*a[2] + b[13]*a[6] + b[14]*a[10] + b[15]*a[14];
  m[15] = b[12]*a[3] + b[13]*a[7] + b[14]*a[11] + b[15]*a[15];    

  return m;
}


void operator*=(Matrix &a, const Matrix &b)
{
  a = a*b;
}

Vector buildvector(float x, float y, float z)
{
  Vector v;
  v[0] = x;
  v[1] = y;
  v[2] = z;
  v[3] = 1;
  return v;             
}

Vector operator*(const Matrix &a, const Vector &v)
{
  Vector vnew;

  vnew[0] = v[0]*a[0] + v[1]*a[4] + v[2]*a[8] + v[3]*a[12];
  vnew[1] = v[0]*a[1] + v[1]*a[5] + v[2]*a[9] + v[3]*a[13];
  vnew[2] = v[0]*a[2] + v[1]*a[6] + v[2]*a[10] + v[3]*a[14];
  vnew[3] = v[0]*a[3] + v[1]*a[7] + v[2]*a[11] + v[3]*a[15];

  return vnew;
}

Project Homepage: