Subversion Repositories gelsvn

Rev

Rev 89 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 89 Rev 595
-
 
1
/* ----------------------------------------------------------------------- *
-
 
2
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
-
 
3
 * Copyright (C) the authors and DTU Informatics
-
 
4
 * For license and list of authors, see ../../doc/intro.pdf
-
 
5
 * ----------------------------------------------------------------------- */
-
 
6
 
-
 
7
/** @file ArithSqMat3x3Float.h
-
 
8
 * @brief Abstract 3x3 floating point matrix class
-
 
9
 */
-
 
10
 
1
#ifndef __CGLA_ARITHSQMAT3X3FLOAT_H__
11
#ifndef __CGLA_ARITHSQMAT3X3FLOAT_H__
2
#define __CGLA_ARITHSQMAT3X3FLOAT_H__
12
#define __CGLA_ARITHSQMAT3X3FLOAT_H__
3
 
13
 
4
#include "ExceptionStandard.h"
14
#include "ExceptionStandard.h"
5
#include "CGLA.h"
15
#include "CGLA.h"
6
#include "Vec3f.h"
16
#include "Vec3f.h"
7
#include "ArithSqMatFloat.h"
17
#include "ArithSqMatFloat.h"
8
 
18
 
9
namespace CGLA 
19
namespace CGLA 
10
{
20
{
11
 
21
 
12
  CGLA_DERIVEEXCEPTION(Mat3x3fException)
22
  CGLA_DERIVEEXCEPTION(Mat3x3fException)
13
    CGLA_DERIVEEXCEPTION(Mat3x3fSingular)
23
    CGLA_DERIVEEXCEPTION(Mat3x3fSingular)
14
 
24
 
15
    /** \brief 3 by 3 float matrix template.
25
    /** \brief 3 by 3 float matrix template.
16
				
26
				
17
		This class template will typically be used for rotation or
27
		This class template will typically be used for rotation or
18
		scaling matrices for 3D vectors. */
28
		scaling matrices for 3D vectors. */
19
    template<class V, class M>
29
    template<class V, class M>
20
    class ArithSqMat3x3Float: public ArithSqMatFloat<V, M, 3>
30
    class ArithSqMat3x3Float: public ArithSqMatFloat<V, M, 3>
21
    {
31
    {
22
    public:
32
    public:
23
 
33
 
24
      /// Vector type
34
      /// Vector type
25
      typedef V VectorType;
35
      typedef V VectorType;
26
 
36
 
27
      /// The type of a matrix element
37
      /// The type of a matrix element
28
      typedef typename V::ScalarType ScalarType;
38
      typedef typename V::ScalarType ScalarType;
29
 
39
 
30
    public:
40
    public:
31
 
41
 
32
      /// Construct matrix from 3 Vec3f vectors.
42
      /// Construct matrix from 3 Vec3f vectors.
33
      ArithSqMat3x3Float(V _a, V _b, V _c): 
43
      ArithSqMat3x3Float(V _a, V _b, V _c): 
34
	ArithSqMatFloat<V, M, 3> (_a,_b,_c) {}
44
	ArithSqMatFloat<V, M, 3> (_a,_b,_c) {}
35
  
45
  
36
      /// Construct the 0 matrix
46
      /// Construct the 0 matrix
37
      ArithSqMat3x3Float() {}
47
      ArithSqMat3x3Float() {}
38
 
48
 
39
      /// Construct a matrix from a single scalar value.
49
      /// Construct a matrix from a single scalar value.
40
      explicit ArithSqMat3x3Float(ScalarType a): 
50
      explicit ArithSqMat3x3Float(ScalarType a): 
41
	ArithSqMatFloat<V, M, 3>(a) {}
51
	ArithSqMatFloat<V, M, 3>(a) {}
42
 
52
 
43
    };
53
    };
44
 
54
 
45
  /// Invert 3x3 matrix
55
  /// Invert 3x3 matrix
46
  template<class V, class M>
56
  template<class V, class M>
47
    M invert(const ArithSqMat3x3Float<V,M>&);
57
    M invert(const ArithSqMat3x3Float<V,M>&);
48
 
58
 
49
  /** Compute determinant. There is a more generic function for
59
  /** Compute determinant. There is a more generic function for
50
      computing determinants of square matrices (ArithSqMat). This one
60
      computing determinants of square matrices (ArithSqMat). This one
51
      is faster but works only on Mat3x3f */
61
      is faster but works only on Mat3x3f */
52
  template<class V, class M>
62
  template<class V, class M>
53
    inline 
63
    inline 
54
    typename ArithSqMat3x3Float<V,M>::ScalarType
64
    typename ArithSqMat3x3Float<V,M>::ScalarType
55
    determinant(const ArithSqMat3x3Float<V,M>& m)
65
    determinant(const ArithSqMat3x3Float<V,M>& m)
56
    {
66
    {
57
      return 
67
      return 
58
	m[0][0]*m[1][1]*m[2][2] +
68
	m[0][0]*m[1][1]*m[2][2] +
59
	m[0][1]*m[1][2]*m[2][0] +
69
	m[0][1]*m[1][2]*m[2][0] +
60
	m[0][2]*m[1][0]*m[2][1] -
70
	m[0][2]*m[1][0]*m[2][1] -
61
	m[0][2]*m[1][1]*m[2][0] -
71
	m[0][2]*m[1][1]*m[2][0] -
62
	m[0][0]*m[1][2]*m[2][1] -
72
	m[0][0]*m[1][2]*m[2][1] -
63
	m[0][1]*m[1][0]*m[2][2] ;
73
	m[0][1]*m[1][0]*m[2][2] ;
64
    }
74
    }
65
 
75
 
66
 
76
 
67
}
77
}
68
#endif
78
#endif
69
 
79
 
70
 
80
 
71
 
81
 
72
 
82
 
73
 
83
 
74
 
84
 
75
 
85
 
76
 
86