47#include <visp3/core/vpException.h>
48#include <visp3/core/vpMath.h>
49#include <visp3/core/vpMatrix.h>
51#if defined(VISP_HAVE_FUNC__FINITE)
56#if !(defined(VISP_HAVE_FUNC_ISNAN) || defined(VISP_HAVE_FUNC_STD_ISNAN)) || \
57 !(defined(VISP_HAVE_FUNC_ISINF) || defined(VISP_HAVE_FUNC_STD_ISINF)) || \
58 !(defined(VISP_HAVE_FUNC_ISFINITE) || defined(VISP_HAVE_FUNC_STD_ISFINITE) || defined(VISP_HAVE_FUNC__FINITE))
59#if defined _MSC_VER || defined __BORLANDC__
61typedef unsigned __int64 uint64;
64typedef uint64_t uint64;
67#ifndef DOXYGEN_SHOULD_SKIP_THIS
84void emitWarning(
const std::string &message);
86void emitWarning(
const std::string &message)
88 std::cerr <<
"\033[0;31m";
89 std::cerr << message << std::endl;
90 std::cerr <<
"\033[0m";
93const double vpMath::ang_min_sinc = 1.0e-8;
94const double vpMath::ang_min_mc = 2.5e-4;
103#if defined(VISP_HAVE_FAST_MATH)
104 emitWarning(
"isNaN: You are testing whether a double value is a number, but are compiling with fast math options enabled. This function may return an incorrect result.");
106#if defined(VISP_HAVE_FUNC_STD_ISNAN)
107 return std::isnan(value);
108#elif defined(VISP_HAVE_FUNC_ISNAN)
110#elif defined(VISP_HAVE_FUNC__ISNAN)
111 return (_isnan(value) != 0);
116 return ((
static_cast<unsigned int>(ieee754.u >> 32) & 0x7fffffff) + ((
static_cast<unsigned int>(ieee754.u) != 0) > 0x7ff00000) != 0;
127#if defined(VISP_HAVE_FAST_MATH)
128 emitWarning(
"isNaN: You are testing whether a float value is a number, but are compiling with fast math options enabled. This function may return an incorrect result.");
130#if defined(VISP_HAVE_FUNC_STD_ISNAN)
131 return std::isnan(value);
132#elif defined(VISP_HAVE_FUNC_ISNAN)
134#elif defined(VISP_HAVE_FUNC__ISNAN)
135 return (_isnan(value) != 0);
140 return ((
static_cast<unsigned int>(ieee754.u) & 0x7fffffff) > 0x7f800000;
153#if defined(VISP_HAVE_FAST_MATH)
154 emitWarning(
"isInf: You are testing whether a double value is infinite, but are compiling with fast math options enabled. This function may return an incorrect result.");
156#if defined(VISP_HAVE_FUNC_STD_ISINF)
157 return std::isinf(value);
158#elif defined(VISP_HAVE_FUNC_ISINF)
164 return (
static_cast<unsigned int>(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 && (
static_cast<unsigned int>(ieee754.u) == 0;
177#if defined(VISP_HAVE_FAST_MATH)
178 emitWarning(
"isInf: You are testing whether a float value is infinite, but are compiling with fast math options enabled. This function may return an incorrect result.");
180#if defined(VISP_HAVE_FUNC_STD_ISINF)
181 return std::isinf(value);
182#elif defined(VISP_HAVE_FUNC_ISINF)
188 return ((
static_cast<unsigned int>(ieee754.u) & 0x7fffffff) == 0x7f800000;
200#if defined(VISP_HAVE_FUNC_STD_ISFINITE)
201 return std::isfinite(value);
202#elif defined(VISP_HAVE_FUNC_ISFINITE)
203 return isfinite(value);
204#elif defined(VISP_HAVE_FUNC__FINITE)
205 return _finite(value);
219#if defined(VISP_HAVE_FUNC_STD_ISFINITE)
220 return std::isfinite(value);
221#elif defined(VISP_HAVE_FUNC_ISFINITE)
222 return isfinite(value);
223#elif defined(VISP_HAVE_FUNC__FINITE)
224 return _finitef(value);
237 size_t str_size = str.size();
238 for (
size_t i = 0; i < str_size; ++i) {
239 if (isdigit(str[i]) ==
false) {
256 if (fabs(x) < ang_min_mc) {
257 return 0.5 - x * x / 24.0;
260 return ((1.0 - cosx) / x / x);
274 if (fabs(x) < ang_min_mc) {
275 return (1. / 6.0 - x * x / 120.0);
278 return ((1.0 - (sinx / x)) / x / x);
291 if (fabs(x) < ang_min_sinc) {
292 return 1.0 - x * x / 6.0;
308 if (fabs(x) < ang_min_sinc) {
309 return 1.0 - x * x / 6.0;
329 size_t size = v.size();
331 double sum = std::accumulate(v.begin(), v.end(), 0.0);
333 return sum / (
static_cast<double>(size));
348 const size_t val_2 = 2;
349 std::vector<double> v_copy = v;
350 size_t size = v_copy.size();
353 std::nth_element(v_copy.begin(), v_copy.begin() + n, v_copy.end());
354 double val_n = v_copy[n];
356 if ((size % val_2) == 1) {
360 std::nth_element(v_copy.begin(), v_copy.begin() + (n - 1), v_copy.end());
361 return 0.5 * (val_n + v_copy[n - 1]);
382 std::vector<double> diff(v.size());
383#if VISP_CXX_STANDARD > VISP_CXX_STANDARD_98
384 std::transform(v.begin(), v.end(), diff.begin(), std::bind(std::minus<double>(), std::placeholders::_1, mean));
386 std::transform(v.begin(), v.end(), diff.begin(), std::bind2nd(std::minus<double>(), mean));
389 double sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0);
390 double divisor =
static_cast<double> (v.size());
391 if (useBesselCorrection && (v.size() > 1)) {
392 divisor = divisor - 1;
395 return std::sqrt(sq_sum / divisor);
413 const unsigned int val_3 = 3;
414 if (imPts.size() < val_3) {
418 double x_mean = 0, y_mean = 0;
419 size_t imPts_size = imPts.size();
420 for (
size_t i = 0; i < imPts_size; ++i) {
422 x_mean += imPt.
get_u();
423 y_mean += imPt.
get_v();
425 x_mean /= imPts.size();
426 y_mean /= imPts.size();
429 imPts_size = imPts.size();
430 for (
size_t i = 0; i < imPts_size; ++i) {
432 AtA[0][0] += (imPt.
get_u() - x_mean) * (imPt.
get_u() - x_mean);
433 AtA[0][1] += (imPt.
get_u() - x_mean) * (imPt.
get_v() - y_mean);
434 AtA[1][1] += (imPt.
get_v() - y_mean) * (imPt.
get_v() - y_mean);
436 AtA[1][0] = AtA[0][1];
442 a = eigenvectors[0][0];
443 b = eigenvectors[1][0];
444 c = (a * x_mean) + (b * y_mean);
447 imPts_size = imPts.size();
448 for (
size_t i = 0; i < imPts_size; ++i) {
449 double x0 = imPts[i].get_u();
450 double y0 = imPts[i].get_v();
452 error += std::fabs((a * x0) + ((b * y0) - c));
455 return error / imPts.size();
479unsigned int vpMath::modulo(
unsigned int a,
unsigned int n) {
return ((a % n) + n) % n; }
523 const unsigned int index_0 = 0;
524 const unsigned int index_1 = 1;
525 const unsigned int index_2 = 2;
526 const unsigned int index_3 = 3;
528 ecef_M_ned[index_0][index_0] = -sin(lat) * cos(lon);
529 ecef_M_ned[index_0][index_1] = -sin(lon);
530 ecef_M_ned[index_0][index_2] = -cos(lat) * cos(lon);
531 ecef_M_ned[index_0][index_3] = radius * cos(lon) * cos(lat);
532 ecef_M_ned[index_1][index_0] = -sin(lat) * sin(lon);
533 ecef_M_ned[index_1][index_1] = cos(lon);
534 ecef_M_ned[index_1][index_2] = -cos(lat) * sin(lon);
535 ecef_M_ned[index_1][index_3] = radius * sin(lon) * cos(lat);
536 ecef_M_ned[index_2][index_0] = cos(lat);
537 ecef_M_ned[index_2][index_1] = 0;
538 ecef_M_ned[index_2][index_2] = -sin(lat);
539 ecef_M_ned[index_2][index_3] = radius * sin(lat);
587 const unsigned int index_0 = 0;
588 const unsigned int index_1 = 1;
589 const unsigned int index_2 = 2;
590 const unsigned int index_3 = 3;
593 ecef_M_enu[index_0][index_0] = -sin(lon);
594 ecef_M_enu[index_0][index_1] = -sin(lat) * cos(lon);
595 ecef_M_enu[index_0][index_2] = cos(lat) * cos(lon);
596 ecef_M_enu[index_0][index_3] = radius * cos(lon) * cos(lat);
597 ecef_M_enu[index_1][index_0] = cos(lon);
598 ecef_M_enu[index_1][index_1] = -sin(lat) * sin(lon);
599 ecef_M_enu[index_1][index_2] = cos(lat) * sin(lon);
600 ecef_M_enu[index_1][index_3] = radius * sin(lon) * cos(lat);
601 ecef_M_enu[index_2][index_0] = 0;
602 ecef_M_enu[index_2][index_1] = cos(lat);
603 ecef_M_enu[index_2][index_2] = sin(lat);
604 ecef_M_enu[index_2][index_3] = radius * sin(lat);
625 assert(maxPoints > 0);
627 double a = (4.0 * M_PI) / maxPoints;
629 int m_theta =
static_cast<int>(
round(M_PI / d));
630 double d_theta = M_PI / m_theta;
631 double d_phi = a / d_theta;
633 std::vector<std::pair<double, double> > lonlat_vec;
634#if (VISP_CXX_STANDARD > VISP_CXX_STANDARD_98)
635 lonlat_vec.reserve(
static_cast<unsigned int>(std::sqrt(maxPoints)));
637 lonlat_vec.reserve(
static_cast<unsigned int>(std::sqrt(
static_cast<double>(maxPoints))));
640 for (
int m = 0; m < m_theta; ++m) {
641 double theta = (M_PI * (m + 0.5)) / m_theta;
642 int m_phi =
static_cast<int>(
round((2.0 * M_PI * sin(theta)) / d_phi));
644 for (
int n = 0; n < m_phi; ++n) {
645 double phi = (2.0 * M_PI * n) / m_phi;
647 double lat = M_PI_2 - theta;
648 lonlat_vec.push_back(std::make_pair(
deg(lon),
deg(lat)));
677 std::vector<vpHomogeneousMatrix> ecef_M_local_vec;
678 ecef_M_local_vec.reserve(lonlatVec.size());
679 size_t lonlatVec_size = lonlatVec.size();
680 for (
size_t i = 0; i < lonlatVec_size; ++i) {
681 double lonDeg = lonlatVec[i].first;
682 double latDeg = lonlatVec[i].second;
685 ecef_M_local_vec.push_back(ecef_M_local);
687 return ecef_M_local_vec;
712 assert(from.
size() == 3);
713 assert(to.
size() == 3);
714 assert(tmp.
size() == 3);
718 const unsigned int index_0 = 0;
719 const unsigned int index_1 = 1;
720 const unsigned int index_2 = 2;
721 const unsigned int index_3 = 3;
724 wMc[index_0][index_0] = right[index_0];
725 wMc[index_0][index_1] = up[index_0];
726 wMc[index_0][index_2] = forward[index_0];
727 wMc[index_0][index_3] = from[index_0];
728 wMc[index_1][index_0] = right[index_1];
729 wMc[index_1][index_1] = up[index_1];
730 wMc[index_1][index_2] = forward[index_1];
731 wMc[index_1][index_3] = from[index_1];
732 wMc[index_2][index_0] = right[index_2];
733 wMc[index_2][index_1] = up[index_2];
734 wMc[index_2][index_2] = forward[index_2];
735 wMc[index_2][index_3] = from[index_2];
748 const unsigned int val_4 = 4;
749 if (r.size() == val_4) {
753 unsigned int r_size = r.size();
754 for (
unsigned int i = 0; i < r_size; ++i) {
769 unsigned int r_size = r.size();
770 for (
unsigned int i = 0; i < r_size; ++i) {
785 unsigned int r_size = r.size();
786 for (
unsigned int i = 0; i < r_size; ++i) {
800 const unsigned int index_0 = 0;
801 const unsigned int index_1 = 1;
802 const unsigned int index_2 = 2;
803 ned_M_enu[index_0][index_0] = 0;
804 ned_M_enu[index_0][index_1] = 1;
805 ned_M_enu[index_1][index_0] = 1;
806 ned_M_enu[index_1][index_1] = 0;
807 ned_M_enu[index_2][index_2] = -1;
unsigned int size() const
Return the number of elements of the 2D array.
Implementation of column vector and the associated operations.
vpColVector & normalize()
static vpColVector crossProd(const vpColVector &a, const vpColVector &b)
error that can be emitted by ViSP classes.
@ notInitialized
Used to indicate that a parameter is not initialized.
@ dimensionError
Bad dimension.
Implementation of an homogeneous matrix and operations on such kind of matrices.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static double msinc(double sinx, double x)
static bool isNaN(double value)
static double rad(double deg)
static double getMedian(const std::vector< double > &v)
static double sinc(double x)
static std::vector< vpHomogeneousMatrix > getLocalTangentPlaneTransformations(const std::vector< std::pair< double, double > > &lonlatVec, double radius, LongLattToHomogeneous func)
static double getStdev(const std::vector< double > &v, bool useBesselCorrection=false)
static vpHomogeneousMatrix lookAt(const vpColVector &from, const vpColVector &to, vpColVector tmp)
vpHomogeneousMatrix(* LongLattToHomogeneous)(double lonDeg, double latDeg, double radius)
static vpHomogeneousMatrix enu2ecef(double lonDeg, double latDeg, double radius)
static double lineFitting(const std::vector< vpImagePoint > &imPts, double &a, double &b, double &c)
static int round(double x)
static bool isFinite(double value)
static double getMean(const std::vector< double > &v)
static bool isInf(double value)
static vpHomogeneousMatrix enu2ned(const vpHomogeneousMatrix &enu_M)
static double mcosc(double cosx, double x)
static double deg(double rad)
static bool isNumber(const std::string &str)
static float modulo(const float &value, const float &modulo)
Gives the rest of value divided by modulo when the quotient can only be an integer.
static std::vector< std::pair< double, double > > computeRegularPointsOnSphere(unsigned int maxPoints)
static vpHomogeneousMatrix ned2ecef(double lonDeg, double latDeg, double radius)
Implementation of a matrix and operations on matrices.
vpColVector eigenValues() const
Implementation of a generic rotation vector.