00001 #ifndef _UTILS_H_
00002 #define _UTILS_H_
00003
00004 #include "math.h"
00005
00006 namespace luma
00007 {
00008 namespace numbers
00009 {
00010
00011 template <class T>
00012 inline T min(const T& v1, const T& v2);
00013
00014 template <class T>
00015 inline T max(const T& v1, const T& v2);
00016
00033 template <class T>
00034 inline T clamp(const T& value, const T& minValue, const T& maxValue);
00035
00054 template <class T>
00055 inline T mod(const T& value, const T& minValue, const T& maxValue);
00056
00074 template <class T>
00075 inline T reflect(const T& value, const T& minValue, const T& maxValue);
00076
00077
00089 template <class T>
00090 inline T lerp(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax);
00091
00095 template <class T>
00096 inline T sigmoid(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax);
00097
00104 template <class T>
00105 inline T ramp(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax);
00106
00111 template <class T>
00112 inline T line(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax);
00113
00117 template <class T>
00118 inline T step(const T& input, const T& inputThreshold, const T& outputMin, const T& outputMax);
00119
00131 template <class T>
00132 inline T frac(T x);
00133
00139 template <class T>
00140 inline T floor(T x);
00141
00152 template <class T>
00153 inline T extreme(T v1, T v2, T center);
00154
00159 template <unsigned int n, class T>
00160 void integrate(T samples[]);
00161
00162
00163
00164
00165
00166
00167 template <class T>
00168 inline T min(const T& v1, const T& v2)
00169 {
00170 return v1 < v2 ? v1 : v2;
00171 }
00172
00173 template <class T>
00174 inline T max(const T& v1, const T& v2)
00175 {
00176 return v1 > v2 ? v1 : v2;
00177 }
00178
00179
00180 template <class T>
00181 inline T clamp(const T& value, const T& minValue, const T& maxValue)
00182 {
00183 return min(maxValue, max(minValue, value));
00184 }
00185
00186 template <class T>
00187 inline T mod(const T& value, const T& minValue, const T& maxValue)
00188 {
00189 T tmpValue = value - minValue;
00190 T range = maxValue - minValue;
00191
00192 int quotient = (int)(tmpValue / range);
00193 T remainder = tmpValue - quotient * range;
00194
00195 if (remainder < 0)
00196 {
00197 remainder += range;
00198 }
00199
00200 return minValue + remainder;
00201 }
00202
00203 template <class T>
00204 inline T reflect(const T& value, const T& minValue, const T& maxValue)
00205 {
00206 T cycleMax = 2 * maxValue - minValue;
00207 T c = mod(value, minValue, cycleMax);
00208
00209 return c <= maxValue ? c: 2 * maxValue - c;
00210 }
00211
00212
00213 template <class T>
00214 inline T lerp(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax)
00215 {
00216 if(value >= inputMax)
00217 {
00218 return outputMax;
00219 }
00220
00221 return ramp(value, inputMin, inputMax, outputMin, outputMax);
00222 }
00223
00224 template <class T>
00225 inline T sigmoid(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax)
00226 {
00227 T w = exp((-2 * value + (inputMax + inputMin))/ (inputMax - inputMin));
00228
00229 return (outputMax - outputMin) / (1 + w) + outputMin;
00230 }
00231
00232 template <class T>
00233 inline T ramp(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax)
00234 {
00235 if(value <= inputMin)
00236 {
00237 return outputMin;
00238 }
00239
00240 return line(value, inputMin, inputMax, outputMin, outputMax);
00241 }
00242
00243 template <class T>
00244 inline T line(const T& value, const T& inputMin, const T& inputMax, const T& outputMin, const T& outputMax)
00245 {
00246 return outputMin + ((value - inputMin) * (outputMax - outputMin) / (inputMax - inputMin));
00247 }
00248
00249 template <class T>
00250 inline T frac(T x)
00251 {
00252 return x >= (T) 0 ? x - (int) x : x + 1 - (int) x;
00253 }
00254
00255 template <class T>
00256 inline T floor(T x)
00257 {
00258 return x >= (T) 0 ? (int) x : (int) x - 1;
00259 }
00260
00261 template <class T>
00262 inline T extreme(T v1, T v2, T center = 0)
00263 {
00264 return abs(v1 - center) > abs(v2 - center) ? v1 : v2;
00265 }
00266
00267 template <class T>
00268 inline T step(const T& input, const T& inputThreshold, const T& outputMin, const T& outputMax)
00269 {
00270 return input < inputThreshold ? outputMin : outputMax;
00271 }
00272
00275 template <unsigned int n, class T>
00276 void integrate(T samples[])
00277 {
00278 for(int i = 1; i < n; i++)
00279 {
00280 samples[i] += samples[i - 1];
00281 }
00282 }
00283
00284 }}
00285 #endif //_UTILS_H_