Subversion Repositories gelsvn

Rev

Rev 12 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 bj 1
#ifndef __CGLA_ARITHSQMAT2X2FLOAT_H__
2
#define __CGLA_ARITHSQMAT2X2FLOAT_H__
3
 
4
#include "ExceptionStandard.h"
5
#include "ArithSqMatFloat.h"
6
 
7
 
8
namespace CGLA 
9
{
10
 
12 jab 11
  CGLA_DERIVEEXCEPTION(Mat2x2fException);
2 bj 12
 
89 jab 13
  /** \brief Two by two float matrix template. 
14
 
15
	This class template is useful for various vector transformations 
16
	in the plane. */
12 jab 17
  template<class V, class M>
18
  class ArithSqMat2x2Float: public ArithSqMatFloat<V,M, 2>
19
  {
20
  public:
2 bj 21
 
12 jab 22
    /// Vector type
23
    typedef V VectorType;
2 bj 24
 
12 jab 25
    /// The type of a matrix element
26
    typedef typename V::ScalarType ScalarType;
2 bj 27
 
12 jab 28
  public:
2 bj 29
 
12 jab 30
    /// Construct a Mat2x2f from two Vec2f vectors.
31
    ArithSqMat2x2Float(V a, V b): 
32
      ArithSqMatFloat<V, M, 2> (a,b) {}
2 bj 33
 
12 jab 34
    /// Construct a Mat2x2f from four scalars.
35
    ArithSqMat2x2Float(ScalarType a, ScalarType b, 
36
		       ScalarType c, ScalarType d): 
37
      ArithSqMatFloat<V, M, 2>(V(a,b),V(c,d)) {}
2 bj 38
 
12 jab 39
    /// Construct the NAN matrix
40
    ArithSqMat2x2Float() {}
2 bj 41
 
12 jab 42
    /// Construct a matrix from a single scalar value.
43
    explicit ArithSqMat2x2Float(ScalarType a): 
44
      ArithSqMatFloat<V, M, 2>(a) {}
45
  };
2 bj 46
 
12 jab 47
  /** Compute the determinant of a Mat2x2f. This function is faster than
48
      the generic determinant function for ArithSqMat */
49
  template<class V, class M>
50
  inline typename ArithSqMat2x2Float<V,M>::ScalarType 
51
  determinant(const ArithSqMat2x2Float<V,M> & m)
52
  {
53
    return m[0][0]*m[1][1]-m[0][1]*m[1][0];
54
  }
2 bj 55
 
12 jab 56
  template<class V, class M>
57
  const M invert(const ArithSqMat2x2Float<V,M>& m)
58
  {
59
    typename M::ScalarType det = determinant(m);
60
    if( !is_tiny(fabs(det)))
61
      {
62
	return M(m[1][1]/det, -m[0][1]/det,-m[1][0]/det, m[0][0]/det);
63
      }
64
    throw Mat2x2fException("Cannot invert matrix");
65
  }
2 bj 66
 
67
 
68
}
69
#endif