Blame view

math/matrix.h 1.44 KB
57729e5b   David Mayerich   changed directory...
1
2
3
4
5
6
  #ifndef RTS_MATRIX_H

  #define RTS_MATRIX_H

  

  //#include "rts/vector.h"

  #include <string.h>

  #include <iostream>

a9275be5   David Mayerich   added vector fiel...
7
  #include "vector.h"

57729e5b   David Mayerich   changed directory...
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  

  namespace rts

  {

  

  template <class T, int N>

  struct matrix

  {

  	//the matrix will be stored in column-major order (compatible with OpenGL)

  	T M[N*N];

  

  	matrix()

  	{

  		for(int r=0; r<N; r++)

  			for(int c=0; c<N; c++)

  				if(r == c)

  					(*this)(r, c) = 1;

  				else

  					(*this)(r, c) = 0;

  	}

  

  	T& operator()(int row, int col)

  	{

  		return M[col * N + row];

  	}

  

  	matrix<T, N> operator=(T rhs)

  	{

  		int Nsq = N*N;

  		for(int i=0; i<Nsq; i++)

  			M[i] = rhs;

  

  		return *this;

  	}

  

  	/*matrix<T, N> operator=(matrix<T, N> rhs)

  	{

  		for(int i=0; i<N; i++)

  			M[i] = rhs.M[i];

  

  		return *this;

  	}*/

  

a9275be5   David Mayerich   added vector fiel...
50
  	vec<T, N> operator*(vec<T, N> rhs)

57729e5b   David Mayerich   changed directory...
51
  	{

a9275be5   David Mayerich   added vector fiel...
52
  		vec<T, N> result;

57729e5b   David Mayerich   changed directory...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  

  		for(int r=0; r<N; r++)

  			for(int c=0; c<N; c++)

  				result[r] += (*this)(r, c) * rhs[c];

  

  		return result;

  	}

  

  	std::string toStr()

  	{

  		std::stringstream ss;

  

  		for(int r = 0; r < N; r++)

  		{

  			ss<<"| ";

  			for(int c=0; c<N; c++)

  			{

  				ss<<(*this)(r, c)<<" ";

  			}

  			ss<<"|"<<std::endl;

  		}

  

  		return ss.str();

  	}

  

  

  

  

  };

  

  }	//end namespace rts

  

  template <typename T, int N>

  std::ostream& operator<<(std::ostream& os, rts::matrix<T, N> M)

  {

      os<<M.toStr();

      return os;

  }

  

  //#if __GNUC__ > 3 && __GNUC_MINOR__ > 7

  //template<class T, int N> using rtsMatrix = rts::matrix<T, N>;

  //#endif

  

  #endif