Subversion Repositories gelsvn

Rev

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