Subversion Repositories gelsvn

Rev

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

Rev Author Line No. Line
12 jab 1
#ifndef __CGLA_CGLA_H__
2
#define __CGLA_CGLA_H__
2 bj 3
 
4
#include <cmath>
5
#include <climits>
6
#include <cassert>
7
#include <algorithm>
8
 
9
#ifndef M_PI
10
#define M_PI 3.14159265358979323846
11
#define M_PI_2 1.57079632679489661923
12
#endif
13
 
12 jab 14
namespace CGLA 
15
{
21 jrf 16
  /** Procedural definition of NAN */  
17
  const float CGLA_NAN = log(-1.0f);
18
 
19
  /** NAN is used for initialization of vectors and matrices
20
      in debug mode */
21
  const float CGLA_INIT_VALUE = CGLA_NAN;
22
 
12 jab 23
  /** Numerical constant representing something large.
24
      value is a bit arbitrary */
25
  const double BIG=10e+30;
2 bj 26
 
12 jab 27
  /** Numerical constant represents something extremely small.
28
      value is a bit arbitrary */
29
  const double MINUTE=10e-30;
2 bj 30
 
12 jab 31
  /** Numerical constant represents something very small.
32
      value is a bit arbitrary */
33
  const double TINY=3e-7;
2 bj 34
 
12 jab 35
  /** Numerical constant represents something small.
36
      value is a bit arbitrary */
37
  const double SMALL=10e-2;
2 bj 38
 
12 jab 39
  const double SQRT3=sqrt(3.0);
2 bj 40
 
12 jab 41
  /// Useful enum that represents coordiante axes.
42
  enum Axis {XAXIS=0,YAXIS=1,ZAXIS=2};
2 bj 43
 
55 jab 44
#ifdef WIN32
45
	inline bool isnan(double x) { return _isnan(x);}
46
#else
47
	inline bool isnan(double x) { return std::isnan(x);}
48
#endif
49
 
12 jab 50
  template<class Scalar>
51
  Scalar s_min(Scalar a, Scalar b)
52
  {
53
    return a<b ? a : b;
54
  }
2 bj 55
 
12 jab 56
  template<class Scalar>
57
  Scalar s_max(Scalar a, Scalar b)
58
  {
59
    return a>b ? a : b;
60
  }
2 bj 61
 
12 jab 62
  ///Template for a function that squares the argument.
63
  template <class Scalar>
64
  inline Scalar sqr(Scalar x) {///
65
    return x*x;}
2 bj 66
 
12 jab 67
  /// Scalaremplate for a function that returns the cube of the argument.
68
  template <class Scalar>
69
  inline Scalar qbe(Scalar x) {///
70
    return x*x*x;}
2 bj 71
 
12 jab 72
  template <class Scalar>
73
  inline bool is_zero(Scalar x)	{return (x > -MINUTE && x < MINUTE);}
2 bj 74
 
12 jab 75
  template <class Scalar>
76
  inline bool is_tiny(Scalar x)	{return (x > -TINY && x < TINY);}
2 bj 77
 
12 jab 78
  /** What power of 2 ?. if x is the argument, find the largest 
79
      y so that 2^y <= x */
45 jab 80
  inline int two_to_what_power(unsigned int x) 
12 jab 81
  {
82
    if (x<1) 
83
      return -1;
84
    int i = 0;
85
    while (x != 1) {x>>=1;i++;}
86
    return i;
87
  }
2 bj 88
 
89
#ifdef __sgi
12 jab 90
  inline int round(float x) {return int(rint(x));}
2 bj 91
#else
12 jab 92
  inline int round(float x) {return int(x+0.5);}
2 bj 93
#endif
94
 
12 jab 95
  template<class T>
96
  inline T sign(T x) {return x>=T(0) ? 1 : -1;}
2 bj 97
 
98
 
12 jab 99
  template<class T>
45 jab 100
  inline T int_pow(T x, unsigned int k) 
12 jab 101
  {
102
    T y = static_cast<T>(1);
45 jab 103
    for(unsigned int i=0;i<k;++i)
12 jab 104
      y *= x;
105
    return y;
106
  }
2 bj 107
 
39 bj 108
	/** raw_assign takes a CGLA vector, matrix or whatever has a get() function
109
			as its first argument and a raw pointer to a (presumed scalar) entity 
110
			as the second argument. the contents dereferenced by the pointer is 
111
			copied to the entity given as first argument. */
12 jab 112
  template<class T, class S>
113
  void raw_assign(T& a,  const S* b)
114
  {
115
    memcpy(static_cast<void*>(a.get()),static_cast<const void*>(b),sizeof(T));
116
  }
2 bj 117
 
118
}
119
 
120
#endif