mirror of https://github.com/CGAL/cgal
117 lines
3.7 KiB
C++
117 lines
3.7 KiB
C++
// Copyright (c) 2009 INRIA Sophia-Antipolis (France).
|
|
// All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org).
|
|
// You can redistribute it and/or modify it under the terms of the GNU
|
|
// General Public License as published by the Free Software Foundation,
|
|
// either version 3 of the License, or (at your option) any later version.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $URL: https://scm.gforge.inria.fr/svn/cgal/branches/features/Mesh_3-experimental-GF/Mesh_3/include/CGAL/Mesh_3/Robust_intersection_kernel.h $
|
|
// $Id: Robust_intersection_kernel.h 67573 2012-02-02 14:54:51Z lrineau $
|
|
//
|
|
//
|
|
// Author(s) : Stephane Tayeb
|
|
//
|
|
//******************************************************************************
|
|
// File Description :
|
|
//******************************************************************************
|
|
|
|
#ifndef CGAL_MESH_3_ROBUST_INTERSECTION_KERNEL_3_H
|
|
#define CGAL_MESH_3_ROBUST_INTERSECTION_KERNEL_3_H
|
|
|
|
#include <CGAL/license/Mesh_3.h>
|
|
|
|
|
|
#include <CGAL/Cartesian_converter.h>
|
|
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
|
#include <CGAL/Simple_cartesian.h>
|
|
#include <CGAL/Gmpq.h>
|
|
|
|
|
|
namespace CGAL {
|
|
|
|
namespace Mesh_3 {
|
|
|
|
template < typename K_ >
|
|
class Robust_intersection_for_kernel_3
|
|
{
|
|
public:
|
|
typedef typename K_::Line_3 Line_3;
|
|
typedef typename K_::Plane_3 Plane_3;
|
|
|
|
typedef Object result_type;
|
|
|
|
typedef Robust_intersection_for_kernel_3<K_> Self;
|
|
|
|
typedef Exact_predicates_exact_constructions_kernel EK;
|
|
// typedef Simple_cartesian<Gmpq> EK;
|
|
typedef Cartesian_converter<typename K_::Kernel, EK> To_exact;
|
|
typedef Cartesian_converter<EK, typename K_::Kernel> Back_from_exact;
|
|
|
|
// forward to the base
|
|
template<class T1, class T2>
|
|
Object operator() (const T1& t, const T2& s) const
|
|
{
|
|
return CGAL::CommonKernelFunctors::Intersect_3<K_>()(t, s);
|
|
}
|
|
|
|
// exact computation only for Intersect_3()(Line_3, Plane_3)
|
|
Object operator() (const Line_3& line, const Plane_3& plane) const
|
|
{
|
|
// Switch to exact
|
|
To_exact to_exact;
|
|
Back_from_exact back_from_exact;
|
|
EK::Intersect_3 exact_intersection = EK().intersect_3_object();
|
|
Object object = exact_intersection(to_exact(line), to_exact(plane));
|
|
// std::exit(1);
|
|
if ( const EK::Point_3* p = object_cast<EK::Point_3>(&object) )
|
|
return make_object(back_from_exact(*p));
|
|
else if ( const EK::Segment_3* seg = object_cast<EK::Segment_3>(&object) )
|
|
return make_object(back_from_exact(*seg));
|
|
else
|
|
return Object();
|
|
}
|
|
}; // end template Robust_intersection_for_kernel_3
|
|
|
|
|
|
template <typename K_base, typename Kernel>
|
|
struct Robust_intersection_kernel_base
|
|
: public K_base::template Base<Kernel>::Type
|
|
{
|
|
|
|
// template < typename Kernel2 >
|
|
// struct Base {
|
|
// typedef typename K_base::template Base<Kernel2> K2;
|
|
// typedef Robust_intersection_kernel_base<K2> Type;
|
|
// };
|
|
|
|
typedef Robust_intersection_for_kernel_3<Kernel> Intersect_3;
|
|
|
|
Intersect_3
|
|
intersect_3_object() const
|
|
{
|
|
return Intersect_3();
|
|
}
|
|
}; // end template Robust_intersection_kernel_base
|
|
|
|
template <typename K>
|
|
struct Robust_intersection_kernel
|
|
: Type_equality_wrapper<Robust_intersection_kernel_base<K,
|
|
Robust_intersection_kernel<K> >,
|
|
Robust_intersection_kernel<K> >
|
|
{};
|
|
|
|
|
|
|
|
} // end namespace Mesh_3
|
|
|
|
} //namespace CGAL
|
|
|
|
#endif // CGAL_MESH_3_ROBUST_INTERSECTION_KERNEL_3_H
|