Subversion Repositories gelsvn

Rev

Rev 10 | Rev 44 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 10 Rev 12
Line 1... Line 1...
1
#ifndef __CGLA_ARITHSQMATFLOAT_H__
1
#ifndef __CGLA_ARITHSQMATFLOAT_H__
2
#define __CGLA_ARITHSQMATFLOAT_H__
2
#define __CGLA_ARITHSQMATFLOAT_H__
3
 
3
 
4
#include "ArithMatFloat.h"
4
#include "ArithMatFloat.h"
5
 
5
 
6
namespace CGLA {
6
namespace CGLA 
-
 
7
{
7
 
8
 
8
	/** Template for square matrices.
9
  /** Template for square matrices.
9
			Some functions like trace and determinant work only on
10
      Some functions like trace and determinant work only on
10
			square matrices. To express this in the class hierarchy,
11
      square matrices. To express this in the class hierarchy,
11
			ArithSqMatFloat was created. ArithSqMatFloat is derived from ArithMat
12
      ArithSqMatFloat was created. ArithSqMatFloat is derived from ArithMat
12
			and contains a few extra facilities applicable only to
13
      and contains a few extra facilities applicable only to
13
			square matrices.
14
      square matrices.
14
	*/
15
  */
15
	template <class VT, class MT, int ROWS>
16
  template <class VT, class MT, int ROWS>
16
	class ArithSqMatFloat: public ArithMatFloat<VT,VT,MT,ROWS> 
17
    class ArithSqMatFloat: public ArithMatFloat<VT,VT,MT,ROWS> 
17
	{ 
18
    { 
18
	public:
19
    public:
19
 
20
 
20
		/// Vector type
21
      /// Vector type
21
		typedef VT VectorType;
22
      typedef VT VectorType;
22
 
23
 
23
		/// The type of a matrix element
24
      /// The type of a matrix element
24
		typedef typename VT::ScalarType ScalarType;
25
      typedef typename VT::ScalarType ScalarType;
25
 
26
 
26
	protected:
27
    protected:
27
 
28
 
28
		/// Construct 0 matrix
29
      /// Construct 0 matrix
29
		ArithSqMatFloat() {}
30
      ArithSqMatFloat() {}
30
 
31
 
31
		/// Construct matrix where all values are equal to constructor argument.
32
      /// Construct matrix where all values are equal to constructor argument.
32
		explicit ArithSqMatFloat(ScalarType _a):
33
      explicit ArithSqMatFloat(ScalarType _a):
33
			ArithMatFloat<VT,VT,MT,ROWS>(_a) {}
34
	ArithMatFloat<VT,VT,MT,ROWS>(_a) {}
34
 
35
 
35
		/// Construct 2x2 Matrix from two vectors
36
      /// Construct 2x2 Matrix from two vectors
36
		ArithSqMatFloat(VT _a, VT _b): 
37
      ArithSqMatFloat(VT _a, VT _b): 
37
			ArithMatFloat<VT,VT,MT,ROWS>(_a,_b) {}
38
	ArithMatFloat<VT,VT,MT,ROWS>(_a,_b) {}
38
 
39
 
39
		/// Construct 3x3 Matrix from three vectors
40
      /// Construct 3x3 Matrix from three vectors
40
		ArithSqMatFloat(VT _a, VT _b, VT _c): 
41
      ArithSqMatFloat(VT _a, VT _b, VT _c): 
41
			ArithMatFloat<VT,VT,MT,ROWS>(_a,_b,_c) {}
42
	ArithMatFloat<VT,VT,MT,ROWS>(_a,_b,_c) {}
42
 
43
 
43
		/// Construct 4x4 Matrix from four vectors
44
      /// Construct 4x4 Matrix from four vectors
44
		ArithSqMatFloat(VT _a, VT _b, VT _c, VT _d): 
45
      ArithSqMatFloat(VT _a, VT _b, VT _c, VT _d): 
45
			ArithMatFloat<VT,VT,MT,ROWS>(_a,_b,_c,_d) {}
46
	ArithMatFloat<VT,VT,MT,ROWS>(_a,_b,_c,_d) {}
46
 
-
 
47
		/// Construct matrix from array of values.
-
 
48
		explicit ArithSqMatFloat(const ScalarType* sa) {set(sa);}
-
 
49
		
-
 
50
	public:
-
 
51
 
-
 
52
		/** Assignment multiplication of matrices. 
-
 
53
				This function is not very efficient. This because we need a temporary
-
 
54
				matrix anyway, so it can't really be made efficient. */
-
 
55
		const MT& operator*=(const MT& m2)
-
 
56
			{
-
 
57
				(*this) = (*this) * m2;
-
 
58
				return static_cast<const MT&>(*this);
-
 
59
			}
-
 
60
		
47
		
61
		void identity()
48
    public:
62
		{
-
 
63
			for(int i=0;i<ROWS;++i)
-
 
64
				{
-
 
65
					for(int j=0;j<ROWS;++j)
-
 
66
						(*this)[i][j] = ScalarType(0);
-
 
67
					(*this)[i][i] = ScalarType(1);
-
 
68
				}
-
 
69
		}
-
 
70
 
49
 
71
		
-
 
72
	};
-
 
73
 
-
 
74
	/** Multiply two matrices derived from same type, 
50
      /** Assignment multiplication of matrices. 
75
			producing a new of same type */
51
	  This function is not very efficient. This because we need a temporary
76
	template <class VT, class MT, int ROWS>
-
 
77
	inline MT operator*(const ArithSqMatFloat<VT,MT,ROWS>& m1,
52
	  matrix anyway, so it can't really be made efficient. */
78
											const ArithSqMatFloat<VT,MT,ROWS>& m2) 
53
      const MT& operator*=(const MT& m2)
79
	{
54
	{
80
		MT n;
-
 
81
		for(int i=0;i<ROWS;i++)
-
 
82
			for(int j=0;j<ROWS;j++)
55
	  (*this) = (*this) * m2;
83
				{
-
 
84
					n[i][j] = 0;
-
 
85
					for(int k=0;k<ROWS;k++)
-
 
86
						n[i][j] += m1[i][k] * m2[k][j]; 
56
	  return static_cast<const MT&>(*this);
87
				}
-
 
88
		return n;
-
 
89
	}
57
	}
90
 
58
		
91
	/** Compute the transpose of a square matrix. This function returns
-
 
92
			the transpose of its argument. */
59
      void identity()
93
	template <class VT, class MT, int ROWS>
-
 
94
	inline MT transpose(const ArithSqMatFloat<VT,MT,ROWS>& m) 
-
 
95
	{
60
	{
-
 
61
	  for(int i=0;i<ROWS;++i)
96
		MT m_new;
62
	    {
97
		for(int i=0;i<MT::get_v_dim();i++)
63
	      for(int j=0;j<ROWS;++j)
98
			for(int j=0;j<MT::get_h_dim();j++)
64
		(*this)[i][j] = ScalarType(0);
99
				m_new[i][j] = m[j][i];
65
	      (*this)[i][i] = ScalarType(1);
100
		return m_new;
66
	    }
101
	}
67
	}
102
 
68
 
-
 
69
		
-
 
70
    };
-
 
71
 
-
 
72
  /** Multiply two matrices derived from same type, 
-
 
73
      producing a new of same type */
-
 
74
  template <class VT, class MT, int ROWS>
-
 
75
    inline MT operator*(const ArithSqMatFloat<VT,MT,ROWS>& m1,
-
 
76
			const ArithSqMatFloat<VT,MT,ROWS>& m2) 
-
 
77
    {
-
 
78
      MT n;
-
 
79
      for(int i=0;i<ROWS;i++)
-
 
80
	for(int j=0;j<ROWS;j++)
-
 
81
	  {
-
 
82
	    n[i][j] = 0;
-
 
83
	    for(int k=0;k<ROWS;k++)
-
 
84
	      n[i][j] += m1[i][k] * m2[k][j]; 
-
 
85
	  }
-
 
86
      return n;
-
 
87
    }
-
 
88
 
-
 
89
  /** Compute the transpose of a square matrix. This function returns
-
 
90
      the transpose of its argument. */
-
 
91
  template <class VT, class MT, int ROWS>
-
 
92
    inline MT transpose(const ArithSqMatFloat<VT,MT,ROWS>& m) 
-
 
93
    {
-
 
94
      MT m_new;
-
 
95
      for(int i=0;i<MT::get_v_dim();i++)
-
 
96
	for(int j=0;j<MT::get_h_dim();j++)
-
 
97
	  m_new[i][j] = m[j][i];
-
 
98
      return m_new;
-
 
99
    }
-
 
100
 
103
	/// Compute trace. Works only for sq. matrices.
101
  /// Compute trace. Works only for sq. matrices.
104
	template <class VT, class MT, int ROWS>
102
  template <class VT, class MT, int ROWS>
105
	inline typename MT::ScalarType trace(const ArithSqMatFloat<VT,MT,ROWS>& M)
103
    inline typename MT::ScalarType trace(const ArithSqMatFloat<VT,MT,ROWS>& M)
106
	{
104
    {
107
		typename ArithSqMatFloat<VT,MT,ROWS>::ScalarType s=0;
105
      typename ArithSqMatFloat<VT,MT,ROWS>::ScalarType s=0;
108
		for(int i=0;i<ROWS;i++)
106
      for(int i=0;i<ROWS;i++)
109
			s += M[i][i];
107
	s += M[i][i];
110
		return s;
108
      return s;
111
	}
109
    }
112
 
110
 
113
}
111
}
114
#endif
112
#endif