mirror of https://github.com/CGAL/cgal
Merge pull request #5391 from afabri/Filtered_kernel-compare_distance-GF
Filtered Kernel: Add static filter for Compare_distance_3
This commit is contained in:
commit
f59411d9a9
|
|
@ -0,0 +1,146 @@
|
|||
// Copyright (c) 2011 GeometryFactory Sarl (France)
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
//
|
||||
// Author(s) : Andreas Fabri
|
||||
|
||||
|
||||
#ifndef CGAL_INTERNAL_STATIC_FILTERS_COMPARE_DISTANCE_3_H
|
||||
#define CGAL_INTERNAL_STATIC_FILTERS_COMPARE_DISTANCE_3_H
|
||||
|
||||
#include <CGAL/Profile_counter.h>
|
||||
#include <CGAL/internal/Static_filters/tools.h>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
namespace internal {
|
||||
|
||||
namespace Static_filters_predicates {
|
||||
|
||||
|
||||
template < typename K_base >
|
||||
class Compare_distance_3
|
||||
: public K_base::Compare_distance_3
|
||||
{
|
||||
typedef typename K_base::Point_3 Point_3;
|
||||
typedef typename K_base::Vector_3 Vector_3;
|
||||
typedef typename K_base::Compare_distance_3 Base;
|
||||
|
||||
public:
|
||||
|
||||
typedef typename Base::result_type result_type;
|
||||
|
||||
using Base::operator();
|
||||
|
||||
result_type operator()(const Point_3 &p, const Point_3& q, const Point_3& r) const
|
||||
{
|
||||
CGAL_BRANCH_PROFILER(std::string("semi-static attempts/calls to : ") +
|
||||
std::string(CGAL_PRETTY_FUNCTION), tmp);
|
||||
|
||||
Get_approx<Point_3> get_approx; // Identity functor for all points
|
||||
// but lazy points
|
||||
|
||||
if(q == r){
|
||||
return EQUAL;
|
||||
}
|
||||
double px, py, pz, qx, qy, qz, rx, ry, rz;
|
||||
|
||||
if (fit_in_double(get_approx(p).x(), px) && fit_in_double(get_approx(p).y(), py) &&
|
||||
fit_in_double(get_approx(p).z(), pz) &&
|
||||
fit_in_double(get_approx(q).x(), qx) && fit_in_double(get_approx(q).y(), qy) &&
|
||||
fit_in_double(get_approx(q).z(), qz) &&
|
||||
fit_in_double(get_approx(r).x(), rx) && fit_in_double(get_approx(r).y(), ry) &&
|
||||
fit_in_double(get_approx(r).z(), rz))
|
||||
{
|
||||
CGAL_BRANCH_PROFILER_BRANCH(tmp);
|
||||
double qpx;
|
||||
qpx = (qx - px);
|
||||
double qpy;
|
||||
qpy = (qy - py);
|
||||
double qpz;
|
||||
qpz = (qz - pz);
|
||||
double qp2;
|
||||
qp2 = ((square( qpx ) + square( qpy )) + square( qpz ));
|
||||
double rpx;
|
||||
rpx = (rx - px);
|
||||
double rpy;
|
||||
rpy = (ry - py);
|
||||
double rpz;
|
||||
rpz = (rz - pz);
|
||||
double rp2;
|
||||
rp2 = ((square( rpx ) + square( rpy )) + square( rpz ));
|
||||
Sign int_tmp_result = EQUAL;
|
||||
double double_tmp_result;
|
||||
double eps;
|
||||
double_tmp_result = (qp2 - rp2);
|
||||
double max1 = CGAL::abs(qpx);
|
||||
if( (max1 < CGAL::abs(qpy)) )
|
||||
{
|
||||
max1 = CGAL::abs(qpy);
|
||||
}
|
||||
if( (max1 < CGAL::abs(qpz)) )
|
||||
{
|
||||
max1 = CGAL::abs(qpz);
|
||||
}
|
||||
if( (max1 < CGAL::abs(rpx)) )
|
||||
{
|
||||
max1 = CGAL::abs(rpx);
|
||||
}
|
||||
if( (max1 < CGAL::abs(rpy)) )
|
||||
{
|
||||
max1 = CGAL::abs(rpy);
|
||||
}
|
||||
if( (max1 < CGAL::abs(rpz)) )
|
||||
{
|
||||
max1 = CGAL::abs(rpz);
|
||||
}
|
||||
if( (max1 < 2.42701102401884262260e-147) )
|
||||
{
|
||||
return Base::operator()(p, q, r);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (max1 > 8.37987995621411946582e+152) )
|
||||
{
|
||||
return Base::operator()(p, q, r);
|
||||
}
|
||||
eps = (3.77746921267322435884e-15 * (max1 * max1));
|
||||
if( (double_tmp_result > eps) )
|
||||
{
|
||||
int_tmp_result = LARGER;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (double_tmp_result < -eps) )
|
||||
{
|
||||
int_tmp_result = SMALLER;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Base::operator()(p, q, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
return int_tmp_result;
|
||||
}
|
||||
return Base::operator()(p, q, r);
|
||||
}
|
||||
|
||||
|
||||
}; // end class Compare_distance_3
|
||||
|
||||
} // end namespace Static_filters_predicates
|
||||
|
||||
} // end namespace internal
|
||||
|
||||
} // end namespace CGAL
|
||||
|
||||
#endif // CGAL_INTERNAL_STATIC_FILTERS_COMPARE_DISTANCE_3_H
|
||||
|
|
@ -71,7 +71,7 @@
|
|||
#include <CGAL/internal/Static_filters/Compare_squared_radius_3.h>
|
||||
#include <CGAL/internal/Static_filters/Compare_weighted_squared_radius_3.h>
|
||||
#include <CGAL/internal/Static_filters/Power_side_of_oriented_power_sphere_3.h>
|
||||
|
||||
#include <CGAL/internal/Static_filters/Compare_distance_3.h>
|
||||
|
||||
// #include <CGAL/internal/Static_filters/Coplanar_orientation_3.h>
|
||||
// #include <CGAL/internal/Static_filters/Coplanar_side_of_bounded_circle_3.h>
|
||||
|
|
@ -126,6 +126,8 @@ public:
|
|||
typedef Static_filters_predicates::Compare_weighted_squared_radius_3<K_base> Compare_weighted_squared_radius_3;
|
||||
typedef Static_filters_predicates::Power_side_of_oriented_power_sphere_3<K_base> Power_side_of_oriented_power_sphere_3;
|
||||
|
||||
typedef Static_filters_predicates::Compare_distance_3<K_base> Compare_distance_3;
|
||||
|
||||
Orientation_2
|
||||
orientation_2_object() const
|
||||
{ return Orientation_2(); }
|
||||
|
|
@ -195,6 +197,9 @@ public:
|
|||
compare_weighted_squared_radius_3_object() const
|
||||
{ return Compare_weighted_squared_radius_3(); }
|
||||
|
||||
Compare_distance_3
|
||||
compare_distance_3_object() const
|
||||
{ return Compare_distance_3();}
|
||||
|
||||
enum { Has_static_filters = true };
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue