/*
 * Jeffrey Ladino - jnl22@ccs.neu.edu
 *
 * File: matrix3d.cpp
 *
 * Change Log
 ************
 ** July 24, 1999 - Jeff Ladino
 * Created.
 *
 */

#include "matrix3d.h"
#include <assert.h>
#include <stdio.h>

//
// Constructors
//
matrix3d::matrix3d(){
}

matrix3d::matrix3d(matrix3d& source){
  for(int j=0;j<3;j++)
    for(int i=0;i < 3; i++) 
      data[j][i] = source.data[j][i];
}

// Destructor (default)


// Accessor
vector3d& matrix3d::operator[](unsigned row){
  assert((row<3));
  return data[row];
}


/* add 
*/
matrix3d& matrix3d::operator+(matrix3d& v1){
  matrix3d *m = new matrix3d;
  for(int j=0;j<3;j++)
    for(int i=0;i < 3; i++) 
      m->data[j][i] = data[j][i] + v1[j][i];
  return *m;
}

/* subtract
*/
matrix3d& matrix3d::operator-(matrix3d& v1){
  matrix3d *m = new matrix3d;
  for(int j=0;j<3;j++)
    for(int i=0;i < 3; i++) 
      m->data[j][i] = data[j][i] - v1[j][i];
  return *m;
}

/* scalar multiply
*/
matrix3d& matrix3d::operator*(Real scalar){
  matrix3d *m = new matrix3d;
  for(int j=0;j<3;j++)
    for(int i=0;i < 3; i++) 
      m->data[j][i] = data[j][i] * scalar;
  return *m;
}

/* matrix3d multiply
*/
matrix3d& matrix3d::operator*(matrix3d& v1){
  matrix3d *m = new matrix3d();

  m->data[0][0] = 
    data[0][0]*v1[0][0] + data[0][1]*v1[1][0] + data[0][2]*v1[2][0];
  m->data[0][1] = 
    data[0][0]*v1[0][1] + data[0][1]*v1[1][1] + data[0][2]*v1[2][1];
  m->data[0][2] = 
    data[0][0]*v1[0][2] + data[0][1]*v1[1][2] + data[0][2]*v1[2][2];

  m->data[1][0] = 
    data[1][0]*v1[0][0] + data[1][1]*v1[1][0] + data[1][2]*v1[2][0];
  m->data[1][1] = 
    data[1][0]*v1[0][1] + data[1][1]*v1[1][1] + data[1][2]*v1[2][1];
  m->data[1][2] = 
    data[1][0]*v1[0][2] + data[1][1]*v1[1][2] + data[1][2]*v1[2][2];

  m->data[2][0] = 
    data[2][0]*v1[0][0] + data[2][1]*v1[1][0] + data[2][2]*v1[2][0];
  m->data[2][1] = 
    data[2][0]*v1[0][1] + data[2][1]*v1[1][1] + data[2][2]*v1[2][1];
  m->data[2][2] = 
    data[2][0]*v1[0][2] + data[2][1]*v1[1][2] + data[2][2]*v1[2][2];

  return *m;
}

/* matrix3d by vector3d multiply
 */
vector3d& matrix3d::operator*(vector3d& V){
  vector3d *result = new vector3d;
  if(VERBOSITY == 2)
    printf("MATRIX by Vector multiply\n");
  /*
  result->data[0] = V[0]*data[0][0] + V[1]*data[0][1] + V[2]*data[0][2];
  result->data[1] = V[0]*data[0][1] + V[1]*data[1][1] + V[2]*data[1][2];
  result->data[2] = V[0]*data[0][2] + V[1]*data[1][2] + V[2]*data[2][2];
  */
  result->data[0] = V[0]*data[0][0] + V[1]*data[0][1] + V[2]*data[0][2];
  result->data[1] = V[0]*data[1][0] + V[1]*data[1][1] + V[2]*data[1][2];
  result->data[2] = V[0]*data[2][0] + V[1]*data[2][1] + V[2]*data[2][2];

  if(VERBOSITY == 2){
    printf("matrix\n");
    print();
    printf("vector\n");
    V.print();
    printf("result\n");
    result->print();
  }
  return *result;
}

/* print matrix3d
 */
void matrix3d::print(){
  printf("| %e %e %e |\n",data[0][0], data[0][1], data[0][2]);
  printf("| %e %e %e |\n",data[1][0], data[1][1], data[1][2]);
  printf("| %e %e %e |\n",data[2][0], data[2][1], data[2][2]);
}


