/* MCL Copyright (c) 2012-18, Enzo De Sena All rights reserved. Authors: Enzo De Sena, enzodesena@gmail.com */ #include "comparisonop.h" #include "mcltypes.h" #include "vectorop.h" #include "pointwiseop.h" #include "quaternion.h" #include #if defined(__APPLE__) #if (__GNUC__ >= 4) #include #define isnan(x) std::isnan(x) #else #include #define isnan(x) __isnand((double)x) #endif #endif namespace mcl { bool IsEqual(Real num_a, Real num_b, Real precision) { if (isnan(num_a) || isnan(num_b)) { return false; } return ((Real) std::fabs(((double) num_a) - ((double) num_b))) < precision; } bool IsNan(Real num) { return isnan(num); } std::vector IsNan(std::vector input) { std::vector output; for (Int i=0; i<(Int)input.size(); ++i) { output.push_back(IsNan(input[i])); } return output; } bool IsInf(Real num) { return std::isinf(num); } std::vector IsInf(std::vector input) { std::vector output; for (Int i=0; i<(Int)input.size(); ++i) { output.push_back(IsInf(input[i])); } return output; } std::vector Not(std::vector input) { std::vector output; for (Int i=0; i<(Int)input.size(); ++i) { output.push_back(!input[i]); } return output; } bool All(std::vector input) { for (Int i=0; i<(Int)input.size(); ++i) { if (input[i] == false) { return false; } } return true; } bool None(std::vector input) { return All(Not(input)); } bool Any(std::vector input) { for (Int i=0; i<(Int)input.size(); ++i) { if (input[i] == true) { return true; } } return false; } bool IsSmallerOrEqual(const Real num_a, const Real num_b, const Real precision) { return num_a <= (num_b + precision); } bool IsLargerOrEqual(const Real num_a, const Real num_b, const Real precision) { return num_a >= (num_b - precision); } bool AreAllSmallerOrEqual(const std::vector& vector_a, const std::vector& vector_b) { if ((Int)vector_a.size() != (Int)vector_b.size()) return false; for (Int i=0; i<(Int)(Int)vector_a.size(); ++i) { if (! IsSmallerOrEqual(vector_a[i], vector_b[i])) { return false; } } return true; } bool IsEqual(Complex num_a, Complex num_b, Real precision) { return (std::fabs(num_a.real() - num_b.real()) < precision) & (std::fabs(num_a.imag() - num_b.imag()) < precision); } bool IsEqual(const Quaternion& q_a, const Quaternion& q_b) { return IsEqual(q_a.w(), q_b.w()) & IsEqual(q_a.x(), q_b.x()) & IsEqual(q_a.y(), q_b.y()) & IsEqual(q_a.z(), q_b.z()); } bool IsEqual(const std::vector& vector_a, const std::vector& vector_b) { if ((Int)vector_a.size() != (Int)vector_b.size()) return false; for (Int i=0; i<(Int)vector_a.size(); ++i) { if (vector_a[i] != vector_b[i]) { return false; } } return true; } bool IsReal(const std::vector& input) { const Int size = input.size(); for (Int i=0; i points_a, std::vector points_b) { const Int num_points = (Int)points_a.size(); if (num_points != (Int)points_b.size()) { return false; } for (Int i=0; i input_data_b, Real precision) { return IsEqual(input_data_a, input_data_b.data(), input_data_b.size(), precision); } bool IsEqual(const std::vector input_data_b, const Real* input_data_a, Real precision) { return IsEqual(input_data_a, input_data_b.data(), input_data_b.size(), precision); } } // namespace mcl