vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gm_utils.h
Go to the documentation of this file.
1 // gmUtils.h - graphics math utility functions
2 //
3 // libgm++: Graphics Math Library
4 // Ferdi Scheepers and Stephen F May
5 // 15 June 1994
6 // ----------------------------------
7 // modified: October 2002
8 // Pavel Kolcarek, kolcarek@fi.muni.cz
9 //
10 
11 #ifndef GM_UTILS_H
12 #define GM_UTILS_H
13 
14 #ifdef WIN32
15 #pragma warning( disable : 4244 )
16 #endif
17 
18 #include <iostream>
19 #include <math.h>
20 #include <gm_bool.h>
21 #include <gm_const.h>
22 
23 // ONE-ARGUMENT UTILITY FUNCTIONS
24 
25 inline double gmAbs(double f)
26 {
27  return (f >= 0) ? f : -f;
28 }
29 
30 inline double gmCeil(double f)
31 {
32  return (f == int(f)) ? f : (f > 0) ? double(int(f) + 1) : double(int(f));
33 }
34 
35 inline double gmCube(double f)
36 {
37  return f * f * f;
38 }
39 
40 inline double gmDegrees(double f)
41 {
42  return f * gmRADTODEG;
43 }
44 
45 inline double gmFloor(double f)
46 {
47  return (f == int(f)) ? f : (f > 0) ? double(int(f)) : double(int(f) - 1);
48 }
49 
50 inline double gmInv(double f)
51 {
52  return 1.0 / f;
53 }
54 
55 inline bool gmIsZero(double f)
56 {
57  return (gmAbs(f) < gmEPSILON);
58 }
59 
60 inline double gmRadians(double f)
61 {
62  return f * gmDEGTORAD;
63 }
64 
65 inline double gmRound(double f)
66 {
67  return (f >= 0) ? double(int(f + 0.5)) : double(- int(0.5 - f));
68 }
69 
70 inline double gmSign(double f)
71 {
72  return (f < 0) ? -1.0 : 1.0;
73 }
74 
75 inline double gmSmooth(double f)
76 {
77  return (3.0 - 2.0 * f) * f * f;
78 }
79 
80 inline double gmSqr(double f)
81 {
82  return f * f;
83 }
84 
85 inline double gmTrunc(double f)
86 {
87  return double(int(f));
88 }
89 
90 inline double gmZSign(double f)
91 {
92  return (f > 0) ? 1.0 : (f < 0) ? -1.0 : 0.0;
93 }
94 
95 // TWO-ARGUMENT UTILITY FUNCTIONS
96 
97 inline bool gmFuzEQ(double f, double g)
98 {
99  return (f <= g) ? (f >= g - gmEPSILON) : (f <= g + gmEPSILON);
100 }
101 
102 inline bool gmFuzGEQ(double f, double g)
103 {
104  return (f >= g - gmEPSILON);
105 }
106 
107 inline bool gmFuzLEQ(double f, double g)
108 {
109  return (f <= g + gmEPSILON);
110 }
111 
112 inline double gmMax(double f, double g)
113 {
114  return (f > g) ? f : g;
115 }
116 
117 inline double gmMin(double f, double g)
118 {
119  return (f < g) ? f : g;
120 }
121 
122 inline void gmSwap(double& f, double& g)
123 {
124  double gmTmp = f; f = g; g = gmTmp;
125 }
126 
127 inline void gmSwap(int& i, int& j)
128 {
129  int gmTmp = i; i = j; j = gmTmp;
130 }
131 
132 // MULTI-ARGUMENT UTILITY FUNCTIONS
133 
134 inline void gmClamp(double &f, double l, double h)
135 {
136  if(f < l) f = l;
137  if(f > h) f = h;
138 }
139 
140 inline double gmLerp(double f, double l, double h)
141 {
142  return l + ((h - l) * f );
143 }
144 
145 inline double gmMax(double f, double g, double h)
146 {
147  return (f > g) ? gmMax(f, h) : gmMax(g, h);
148 }
149 
150 inline double gmMin(double f, double g, double h)
151 {
152  return (f < g) ? gmMin(f, h) : gmMin(g, h);
153 }
154 
155 inline double gmSlide(double f, double l, double h)
156 {
157  return (f < 0) ? l : (f > 1) ? h : gmLerp(gmSmooth(f), l, h);
158 }
159 
160 #endif
161 
162