Copy relative_precision_of_to_double from Lazy_exact_nt to Lazy_alpha_nt_3.

This commit is contained in:
Marc Glisse 2018-11-11 12:03:09 +01:00
parent 4dd6526022
commit 45505a3c68
3 changed files with 34 additions and 4 deletions

View File

@ -104,8 +104,11 @@ resorting to exact arithmetic). Access to the interval containing the exact valu
`FT::Approximate_nt approx() const` where `FT::Approximate_nt` is `Interval_nt<Protected>` `FT::Approximate_nt approx() const` where `FT::Approximate_nt` is `Interval_nt<Protected>`
with `Protected=true`. Access to the exact value is provided through the function with `Protected=true`. Access to the exact value is provided through the function
`FT::Exact_nt exact() const` where `FT::Exact_nt` depends on the configuration of %CGAL `FT::Exact_nt exact() const` where `FT::Exact_nt` depends on the configuration of %CGAL
(it is `Gmpq` if `gmp` is available and `Quotient<CGAL::MP_Float>` otherwise). (it may be `mpq_class`, `Gmpq`, `Quotient<CGAL::MP_Float>`, etc).
An overload for the function `double to_double(FT)` is also available. An overload for the function `double to_double(FT)` is also available. Its
precision is controlled through `FT::set_relative_precision_of_to_double()` in
exactly the same way as with `Lazy_exact_nt<NT>`, so a call to `to_double` may
trigger an exact evaluation.
It must be noted that an object of type `FT` is valid as long as the alpha shapes class that creates It must be noted that an object of type `FT` is valid as long as the alpha shapes class that creates
it is valid and has not been modified. it is valid and has not been modified.
For convenience, classical comparison operators are provided for the type `FT`. For convenience, classical comparison operators are provided for the type `FT`.

View File

@ -177,8 +177,25 @@ class Lazy_alpha_nt_3{
const Data_vector& data() const{ return input_points;} const Data_vector& data() const{ return input_points;}
Data_vector& data(){ return input_points;} Data_vector& data(){ return input_points;}
static double & relative_precision_of_to_double_internal()
{
CGAL_STATIC_THREAD_LOCAL_VARIABLE(double, relative_precision_of_to_double, 0.00001);
return relative_precision_of_to_double;
}
public: public:
static const double & get_relative_precision_of_to_double()
{
return relative_precision_of_to_double_internal();
}
static void set_relative_precision_of_to_double(double d)
{
CGAL_assertion((0 < d) & (d < 1));
relative_precision_of_to_double_internal() = d;
}
typedef NT_exact Exact_nt; typedef NT_exact Exact_nt;
typedef NT_approx Approximate_nt; typedef NT_approx Approximate_nt;
@ -419,7 +436,17 @@ struct Alpha_nt_selector_3
template<class Input_traits, bool mode, class Weighted_tag> template<class Input_traits, bool mode, class Weighted_tag>
double to_double(const internal::Lazy_alpha_nt_3<Input_traits, mode, Weighted_tag>& a) double to_double(const internal::Lazy_alpha_nt_3<Input_traits, mode, Weighted_tag>& a)
{ {
return to_double(a.approx()); double r;
if (fit_in_double(a.approx(), r))
return r;
// If it isn't precise enough,
// we trigger the exact computation first,
// which will refine the approximation.
if (!has_smaller_relative_precision(a.approx(), a.get_relative_precision_of_to_double()))
a.exact();
return CGAL_NTS to_double(a.approx());
} }
} //namespace CGAL } //namespace CGAL

View File

@ -478,7 +478,7 @@ public:
return relative_precision_of_to_double_internal(); return relative_precision_of_to_double_internal();
} }
static void set_relative_precision_of_to_double(const double & d) static void set_relative_precision_of_to_double(double d)
{ {
CGAL_assertion((0 < d) & (d < 1)); CGAL_assertion((0 < d) & (d < 1));
relative_precision_of_to_double_internal() = d; relative_precision_of_to_double_internal() = d;