49 #include <visp3/core/vpConfig.h>
57 #if defined(VISP_HAVE_FUNC_ISNAN) || defined(VISP_HAVE_FUNC_STD_ISNAN) || defined(VISP_HAVE_FUNC_ISINF) || defined(VISP_HAVE_FUNC_STD_ISINF) || defined(VISP_HAVE_FUNC_STD_ROUND)
61 #if defined(_WIN32) // Not defined in Microsoft math.h
64 # define M_PI 3.14159265358979323846
68 # define M_PI_2 (M_PI/2.0)
72 # define M_PI_4 (M_PI/4.0)
97 static inline double deg(
double rad) {
return (rad*180.0)/M_PI ; }
104 static inline double rad(
double deg) {
return (deg*M_PI)/180.0 ; }
110 static inline double sqr(
double x) {
return x*x ; }
113 static inline double fact(
unsigned int x) ;
116 static inline long double comb(
unsigned int n,
unsigned int p) ;
119 static inline int round(
const double x) ;
122 static inline int (sign)(
double x) ;
125 static inline bool nul(
double x,
double s=0.001);
128 static inline bool equal(
double x,
double y,
double s=0.001);
131 static inline bool greater(
double x,
double y,
double s=0.001);
140 template <
class Type>
static Type
maximum(
const Type& a,
const Type& b)
142 return (a > b) ? a : b;
151 template <
class Type>
static Type
minimum(
const Type& a,
const Type& b)
153 return (a < b) ? a : b;
161 template <
class Type>
static Type
abs(
const Type& x)
163 return (x < 0) ? -x : x;
168 static double sinc(
double x) ;
169 static double sinc(
double sinx,
double x) ;
170 static double mcosc(
double cosx,
double x) ;
171 static double msinc(
double sinx,
double x) ;
174 static inline double sigmoid(
double x,
double x0=0.,
double x1=1.,
double n=12.);
182 template <
class Type>
static void swap(Type& a, Type& b)
189 static bool isNaN(
const double value);
190 static bool isInf(
const double value);
192 template<
typename _Tp>
static inline _Tp
saturate(
unsigned char v) {
return _Tp(v); }
193 template<
typename _Tp>
static inline _Tp
saturate(
char v) {
return _Tp(v); }
194 template<
typename _Tp>
static inline _Tp
saturate(
unsigned short v) {
return _Tp(v); }
195 template<
typename _Tp>
static inline _Tp
saturate(
short v) {
return _Tp(v); }
196 template<
typename _Tp>
static inline _Tp
saturate(
unsigned v) {
return _Tp(v); }
197 template<
typename _Tp>
static inline _Tp
saturate(
int v) {
return _Tp(v); }
198 template<
typename _Tp>
static inline _Tp
saturate(
float v) {
return _Tp(v); }
199 template<
typename _Tp>
static inline _Tp
saturate(
double v) {
return _Tp(v); }
201 static double getMean(
const std::vector<double> &v);
202 static double getMedian(
const std::vector<double> &v);
203 static double getStdev(
const std::vector<double> &v,
const bool useBesselCorrection=
false);
205 static int modulo(
const int a,
const int n);
208 static const double ang_min_sinc;
209 static const double ang_min_mc;
222 if ( (x == 1) || (x == 0))
return 1;
223 return x *
fact(x-1);
236 if (n == p)
return 1;
251 #if defined(VISP_HAVE_FUNC_ROUND)
254 #elif defined(VISP_HAVE_FUNC_STD_ROUND)
255 return (
int)std::round(x);
257 return (x > 0.0) ? ((int) floor(x + 0.5)) : ((
int) ceil(x - 0.5));
268 #ifndef DOXYGEN_SHOULD_SKIP_THIS
272 #ifndef DOXYGEN_SHOULD_SKIP_THIS
277 if (fabs(x) < std::numeric_limits<double>::epsilon())
308 return(
nul(x-y, s) );
339 double l0 = 1./(1.+exp(0.5*n));
340 double l1 = 1./(1.+exp(-0.5*n));
341 return (1./(1.+exp(-n*((x-x0)/(x1-x0)-0.5)))-l0)/(l1-l0);
345 template<>
inline unsigned char vpMath::saturate<unsigned char>(
char v) {
351 if (std::numeric_limits<char>::is_signed)
352 return (
unsigned char) ((std::max)((
int) v, 0));
354 return (
unsigned char) ((
unsigned int) v > SCHAR_MAX ? 0 : v);
357 template<>
inline unsigned char vpMath::saturate<unsigned char>(
unsigned short v) {
358 return (
unsigned char) (std::min)((
unsigned int) v, (
unsigned int) UCHAR_MAX);
361 template<>
inline unsigned char vpMath::saturate<unsigned char>(
int v) {
362 return (
unsigned char) ((
unsigned int) v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0);
365 template<>
inline unsigned char vpMath::saturate<unsigned char>(
short v) {
366 return saturate<unsigned char> ((int) v);
369 template<>
inline unsigned char vpMath::saturate<unsigned char>(
unsigned int v) {
370 return (
unsigned char) (std::min)(v, (
unsigned int) UCHAR_MAX);
373 template<>
inline unsigned char vpMath::saturate<unsigned char>(
float v) {
375 return saturate<unsigned char> (iv);
378 template<>
inline unsigned char vpMath::saturate<unsigned char>(
double v) {
380 return saturate<unsigned char> (iv);
384 template<>
inline char vpMath::saturate<char>(
unsigned char v) {
385 return (
char) (std::min)((
int) v, SCHAR_MAX);
388 template<>
inline char vpMath::saturate<char>(
unsigned short v) {
389 return (
char) (std::min)((
unsigned int) v, (
unsigned int) SCHAR_MAX);
392 template<>
inline char vpMath::saturate<char>(
int v) {
393 return (
char) ((
unsigned int) (v - SCHAR_MIN) <= (
unsigned int) UCHAR_MAX ? v :
394 v > 0 ? SCHAR_MAX : SCHAR_MIN);
397 template<>
inline char vpMath::saturate<char>(
short v) {
398 return saturate<char>((int) v);
401 template<>
inline char vpMath::saturate<char>(
unsigned int v) {
402 return (
char) (std::min)(v, (
unsigned int) SCHAR_MAX);
405 template<>
inline char vpMath::saturate<char>(
float v) {
407 return saturate<char>(iv);
410 template<>
inline char vpMath::saturate<char>(
double v) {
412 return saturate<char>(iv);
416 template<>
inline unsigned short vpMath::saturate<unsigned short>(
char v) {
422 if (std::numeric_limits<char>::is_signed)
423 return (
unsigned char) ((std::max)((
int) v, 0));
425 return (
unsigned char) ((
unsigned int) v > SCHAR_MAX ? 0 : v);
428 template<>
inline unsigned short vpMath::saturate<unsigned short>(
short v) {
429 return (
unsigned short) (std::max)((
int) v, 0);
432 template<>
inline unsigned short vpMath::saturate<unsigned short>(
int v) {
433 return (
unsigned short) ((
unsigned int) v <= (
unsigned int) USHRT_MAX ? v :
434 v > 0 ? USHRT_MAX : 0);
437 template<>
inline unsigned short vpMath::saturate<unsigned short>(
unsigned int v) {
438 return (
unsigned short) (std::min)(v, (
unsigned int) USHRT_MAX);
441 template<>
inline unsigned short vpMath::saturate<unsigned short>(
float v) {
443 return vpMath::saturate<unsigned short>(iv);
446 template<>
inline unsigned short vpMath::saturate<unsigned short>(
double v) {
448 return vpMath::saturate<unsigned short>(iv);
452 template<>
inline short vpMath::saturate<short>(
unsigned short v) {
453 return (
short) (std::min)((
int) v, SHRT_MAX);
455 template<>
inline short vpMath::saturate<short>(
int v) {
456 return (
short) ((
unsigned int) (v - SHRT_MIN) <= (
unsigned int) USHRT_MAX ? v :
457 v > 0 ? SHRT_MAX : SHRT_MIN);
459 template<>
inline short vpMath::saturate<short>(
unsigned int v) {
460 return (
short) (std::min)(v, (
unsigned int) SHRT_MAX);
462 template<>
inline short vpMath::saturate<short>(
float v) {
464 return vpMath::saturate<short>(iv);
466 template<>
inline short vpMath::saturate<short>(
double v) {
468 return vpMath::saturate<short>(iv);
472 template<>
inline int vpMath::saturate<int>(
float v) {
476 template<>
inline int vpMath::saturate<int>(
double v) {
482 template<>
inline unsigned int vpMath::saturate<unsigned int>(
float v) {
486 template<>
inline unsigned int vpMath::saturate<unsigned int>(
double v) {
static _Tp saturate(double v)
static void swap(Type &a, Type &b)
static _Tp saturate(char v)
static double sigmoid(double x, double x0=0., double x1=1., double n=12.)
static _Tp saturate(unsigned char v)
static bool equal(double x, double y, double s=0.001)
Provides simple mathematics computation tools that are not available in the C mathematics library (ma...
static _Tp saturate(unsigned short v)
static double fact(unsigned int x)
static int round(const double x)
static Type abs(const Type &x)
static Type maximum(const Type &a, const Type &b)
static _Tp saturate(short v)
static bool nul(double x, double s=0.001)
static double sqr(double x)
static Type minimum(const Type &a, const Type &b)
static _Tp saturate(int v)
static double rad(double deg)
static _Tp saturate(unsigned v)
static _Tp saturate(float v)
static long double comb(unsigned int n, unsigned int p)
static double deg(double rad)
static bool greater(double x, double y, double s=0.001)
static int() sign(double x)