Teh first one
[mldemos:kalians-mldemos.git] / _AlgorithmsPlugins / Obstacle / MathLib / Macros.h
1 /*\r
2  * Copyright (C) 2010 Learning Algorithms and Systems Laboratory, EPFL, Switzerland\r
3  * Author: Eric Sauser\r
4  * email:   eric.sauser@a3.epf.ch\r
5  * website: lasa.epfl.ch\r
6  *\r
7  * Permission is granted to copy, distribute, and/or modify this program\r
8  * under the terms of the GNU General Public License, version 2 or any\r
9  * later version published by the Free Software Foundation.\r
10  *\r
11  * This program is distributed in the hope that it will be useful, but\r
12  * WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\r
14  * Public License for more details\r
15  */\r
16 \r
17 #ifndef __MATHMACROS_H_\r
18 #define __MATHMACROS_H_\r
19 \r
20 /**\r
21  * \file Macros\r
22  *\r
23  * \ingroup MathLib\r
24  *\r
25  * \brief Here is a set of useful math Macros\r
26  */\r
27 \r
28 #include "MathLibCommon.h"\r
29 \r
30 /// Constants\r
31 #ifndef R_ZERO\r
32   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
33     #define R_ZERO 0.0\r
34   #else\r
35     #define R_ZERO 0.0f\r
36   #endif\r
37 #endif\r
38 \r
39 #ifndef R_ONE\r
40   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
41     #define R_ONE 1.0\r
42   #else\r
43     #define R_ONE 1.0f\r
44   #endif\r
45 #endif\r
46 \r
47 /// Infinity\r
48 #ifndef R_INFINITY\r
49   #define R_INFINITY (R_ONE/R_ZERO)\r
50 #endif\r
51 \r
52 \r
53 /// The PI constant\r
54 #ifndef PI\r
55   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
56     #define PI 3.14159265358979323846\r
57   #else\r
58     #define PI 3.14159265358979323846f\r
59   #endif\r
60 #endif\r
61 #ifndef PIf\r
62   #define PIf 3.14159265358979323846f\r
63 #endif\r
64 \r
65 #ifndef TWOPI\r
66   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
67     #define TWOPI (2.0*PI)\r
68   #else\r
69     #define TWOPI (2.0f*PIf)\r
70   #endif\r
71 #endif\r
72 #ifndef TWOPIf\r
73   #define TWOPIf (2.0f*PIf)\r
74 #endif\r
75 \r
76 /// Convert degrees to radians\r
77 #ifndef DEG2RAD\r
78   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
79     #define DEG2RAD(x) ((x)*(PI/180.0))\r
80   #else\r
81     #define DEG2RAD(x) ((x)*(PI/180.0f))\r
82   #endif\r
83 #endif\r
84 \r
85 /// Convert radians to degrees\r
86 #ifndef RAD2DEG\r
87   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
88     #define RAD2DEG(x) ((x)*(180.0f/PI))\r
89   #else\r
90     #define RAD2DEG(x) ((x)*(180.0/PI))\r
91   #endif\r
92 #endif\r
93 \r
94 /// Reset the seed of the randomizer\r
95 #ifndef RANDOMIZE\r
96 #define RANDOMIZE   (srand(time(NULL)));\r
97 #endif\r
98 \r
99 /// Give a random number uniformliy distributed between 0 and 1\r
100 #ifndef RND\r
101   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
102     #define RND(x) ((((double)rand())/((double)(RAND_MAX+1.0)))*(x))\r
103   #else\r
104     #define RND(x) ((((float)rand())/((float)(RAND_MAX+1.0)))*(x))\r
105   #endif\r
106 #endif\r
107 \r
108 /// The miminum between two values\r
109 #ifndef MIN\r
110 #define MIN(x,y) (((x)<(y))?(x):(y))\r
111 #endif\r
112 \r
113 /// The maximum between two values\r
114 #ifndef MAX\r
115 #define MAX(x,y) (((x)>(y))?(x):(y))\r
116 #endif\r
117 \r
118 /// Return a value, trunked between a minimum and a maximum\r
119 #ifndef TRUNC\r
120 #define TRUNC(x,mn,mx) (MIN(MAX((x),(mn)),(mx)))\r
121 #endif\r
122 \r
123 /// Trunc the variable between -pi and pi\r
124 #ifndef PTRUNC\r
125 #define PTRUNC(x) {while((x)<-PI) (x)+=TWOPI; while((x)>PI) (x)-=TWOPI;}\r
126 #endif\r
127 \r
128 /// Return the sign of a variable.\r
129 #ifndef SIGN\r
130 #define SIGN(x) (((x)<0.0f)?(-R_ONE):(R_ONE))\r
131 #endif\r
132 \r
133 #ifndef RSIGN\r
134 #define RSIGN(x) (((x)==0.0)?0.0:(SIGN(x)))\r
135 #endif\r
136 \r
137 /// Return a variable signed according to the sign of another\r
138 #ifndef SIGN2\r
139   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
140     #define SIGN2(a,b) ((b) >= 0.0f ? fabs(a) : -fabs(a))\r
141   #else\r
142     #define SIGN2(a,b) ((b) >= 0.0f ? fabsf(a) : -fabsf(a))\r
143   #endif\r
144 #endif\r
145 \r
146 /// Round a variable\r
147 #ifndef ROUND\r
148   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
149     #define ROUND(x) (floor((x)+0.5))\r
150   #else\r
151     #define ROUND(x) float(floor((x)+0.5f))\r
152   #endif\r
153 #endif\r
154 \r
155 /// AN arbitrary mimimal error bound\r
156 #ifndef EPSILON\r
157   #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
158     #define EPSILON   (1e-12)\r
159   #else\r
160     #define EPSILON   (1e-6f)\r
161   #endif\r
162 #endif\r
163 \r
164 /// A wise way to get the hypothenuse\r
165 inline REALTYPE hypot_s(REALTYPE a, REALTYPE b){\r
166   REALTYPE r;\r
167 #ifdef MATHLIB_USE_DOUBLE_AS_REAL\r
168   if (fabs(a) > fabs(b)) {\r
169       r = b / a;\r
170       r = fabs(a) * sqrt(1.0   + r * r);\r
171   } else if (b != 0.0) {\r
172       r = a / b;\r
173       r = fabs(b) * sqrt(1.0 + r * r);\r
174   } else {\r
175       r = 0.0;\r
176   }\r
177   return r;\r
178 #else\r
179   if (fabsf(a) > fabsf(b)) {\r
180       r = b / a;\r
181       r = fabsf(a) * sqrtf(1.0f + r * r);\r
182   } else if (b != 0.0f) {\r
183       r = a / b;\r
184       r = fabsf(b) * sqrtf(1.0f + r * r);\r
185   } else {\r
186       r = 0.0f;\r
187   }\r
188   return r;\r
189 #endif\r
190 }\r
191 \r
192 #endif\r