24 #define DEFAULT_EPS std::numeric_limits<double>::epsilon()*10
31 explicit Approx(
const T& x,
double eps = DEFAULT_EPS)
35 template<
typename OtherDerived>
36 explicit Approx(
const Eigen::MatrixBase<OtherDerived>& x,
double eps = DEFAULT_EPS)
37 : _x(x.eval()), _eps(eps)
40 friend bool operator==(
const T& x1,
const Approx<T>& x2)
42 if constexpr(std::is_same_v<T,double>)
43 return std::fabs(x1-x2._x) < x2._eps;
45 else if(x1.size() != x2._x.size())
51 else if constexpr(std::is_same_v<T,Interval>)
53 return (x1.lb() == x2._x.lb() || x1.lb() == Approx<double>(x2._x.lb(),x2._eps))
54 && (x1.ub() == x2._x.ub() || x1.ub() == Approx<double>(x2._x.ub(),x2._eps));
57 else if constexpr(std::is_same_v<T,Vector>
58 || std::is_same_v<T,IntervalVector>
59 || std::is_same_v<T,Row>
60 || std::is_same_v<T,IntervalRow>
61 || std::is_same_v<T,Matrix>
62 || std::is_same_v<T,IntervalMatrix>)
64 for(Index i = 0 ; i < x1.rows() ; i++)
65 for(Index j = 0 ; j < x1.cols() ; j++)
66 if(!(x1(i,j) == Approx<typename T::Scalar>(x2._x(i,j), x2._eps)))
73 assert_release(
false &&
"Approx::operator== unhandled case");
78 friend std::ostream& operator<<(std::ostream& os,
const Approx<T>& x)
80 os <<
"Approx(" << x._x <<
")";
95 explicit Approx(
const Segment& x,
double eps = DEFAULT_EPS)
99 friend bool operator==(
const Segment& p1,
const Approx<Segment>& p2)
101 return (Approx<IntervalVector>(p1[0], p2._eps) == p2._x[0] && Approx<IntervalVector>(p1[1], p2._eps) == p2._x[1])
102 || (Approx<IntervalVector>(p1[1], p2._eps) == p2._x[0] && Approx<IntervalVector>(p1[0], p2._eps) == p2._x[1]);
105 friend std::ostream& operator<<(std::ostream& os,
const Approx<Segment>& x)
107 os <<
"Approx(" << x._x <<
")";
122 explicit Approx(
const Polygon& x,
double eps = DEFAULT_EPS)
126 friend bool operator==(
const Polygon& p1,
const Approx<Polygon>& p2)
128 size_t n = p1.edges().size();
129 if(p2._x.edges().size() != n)
133 for(i = 0 ; i < n ; i++)
134 if(Approx<Segment>(p1.edges()[0], p2._eps) == p2._x.edges()[i])
139 way = (Approx<Segment>(p1.edges()[1], p2._eps) == p2._x.edges()[(i+1)%n]) ? 1 : -1;
140 assert(way == 1 || (way == -1 && p1.edges()[1] == p2._x.edges()[(i-1+2*n)%n]));
142 for(
size_t j = 0 ; j < n ; j++)
143 if(Approx<Segment>(p1.edges()[j], p2._eps) != p2._x.edges()[(i+way*j+2*n)%n])
149 friend std::ostream& operator<<(std::ostream& os,
const Approx<Polygon>& x)
151 os <<
"Approx(" << x._x <<
")";
161 Approx(
const Polygon&,
double) ->
Represents a polygon (convex or non-convex) defined by its vertices enclosed in IntervalVectors.
Definition codac2_Polygon.h:29
Represents a geometric segment defined by two points enclosed in IntervalVectors.
Definition codac2_Segment.h:27