dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/Arr_triangulation_point_loc...

391 lines
13 KiB
C++

// Copyright (c) 2005,2006,2007,2009,2010,2011 Tel-Aviv University (Israel).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL: https://github.com/CGAL/cgal/blob/v5.1/Arrangement_on_surface_2/include/CGAL/Arr_triangulation_point_location.h $
// $Id: Arr_triangulation_point_location.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Idit Haran <haranidi@post.tau.ac.il>
#ifndef CGAL_ARR_TRIANGULATION_POINT_LOCATION_H
#define CGAL_ARR_TRIANGULATION_POINT_LOCATION_H
#include <CGAL/license/Arrangement_on_surface_2.h>
#include <CGAL/disable_warnings.h>
/*! \file
* Definition of the Arr_triangulation_point_location<Arrangement> template.
*/
#include <CGAL/Arr_observer.h>
#include <CGAL/Arrangement_2/Arr_traits_adaptor_2.h>
#include <CGAL/Arr_point_location_result.h>
#include <CGAL/Constrained_Delaunay_triangulation_2.h>
#include <CGAL/Constrained_triangulation_2.h>
#include <CGAL/Triangulation_face_base_2.h>
#include <CGAL/Triangulation_vertex_base_with_info_2.h>
#include <CGAL/Triangulation_hierarchy_2.h>
#include <CGAL/Constrained_triangulation_plus_2.h>
namespace CGAL {
/*! \class
* A class that answers point-location queries on an arrangement using the
* triangulation algorithm.
*/
template <typename Arrangement_>
class Arr_triangulation_point_location : public Arr_observer<Arrangement_>
{
public:
typedef Arrangement_ Arrangement_2;
typedef typename Arrangement_2::Geometry_traits_2 Geometry_traits_2;
typedef typename Geometry_traits_2::Kernel Kernel;
typedef typename Arrangement_2::Vertex_const_handle Vertex_const_handle;
typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle;
typedef typename Arrangement_2::Face_const_handle Face_const_handle;
typedef typename Arrangement_2::Vertex_handle Vertex_handle;
typedef typename Arrangement_2::Halfedge_handle Halfedge_handle;
typedef typename Arrangement_2::Face_handle Face_handle;
typedef typename Arrangement_2::Vertex_const_iterator Vertex_const_iterator;
typedef typename Arrangement_2::Edge_const_iterator Edge_const_iterator;
typedef typename Arrangement_2::Face_const_iterator Face_const_iterator;
typedef typename Arrangement_2::Halfedge_const_iterator
Halfedge_const_iterator;
typedef typename Arrangement_2::Halfedge_around_vertex_const_circulator
Halfedge_around_vertex_const_circulator;
typedef typename Arrangement_2::Ccb_halfedge_const_circulator
Ccb_halfedge_const_circulator;
typedef typename Arrangement_2::Ccb_halfedge_circulator
Ccb_halfedge_circulator;
typedef typename Arrangement_2::Isolated_vertex_const_iterator
Isolated_vertex_const_iterator;
typedef typename Geometry_traits_2::Point_2 Point_2;
typedef typename Geometry_traits_2::X_monotone_curve_2 X_monotone_curve_2;
typedef std::list<Halfedge_const_handle> Edge_list;
typedef typename Edge_list::iterator Std_edge_iterator;
//----------------------------------------------------------
// Triangulation Types
//----------------------------------------------------------
typedef Triangulation_vertex_base_with_info_2<Vertex_const_handle, Kernel>
Vbb;
typedef Triangulation_hierarchy_vertex_base_2<Vbb> Vb;
//typedef Triangulation_face_base_with_info_2<CGAL::Color,Kernel> Fbt;
typedef Constrained_triangulation_face_base_2<Kernel> Fb;
typedef Triangulation_data_structure_2<Vb,Fb> TDS;
typedef Exact_predicates_tag Itag;
//typedef Constrained_Delaunay_triangulation_2<Kernel, TDS, Itag> CDT;
typedef Constrained_Delaunay_triangulation_2<Kernel, TDS, Itag> CDT_t;
typedef Triangulation_hierarchy_2<CDT_t> CDTH;
typedef Constrained_triangulation_plus_2<CDTH> CDT;
typedef typename CDT::Point CDT_Point;
typedef typename CDT::Edge CDT_Edge;
typedef typename CDT::Face_handle CDT_Face_handle;
typedef typename CDT::Vertex_handle CDT_Vertex_handle;
typedef typename CDT::Finite_faces_iterator CDT_Finite_faces_iterator;
typedef typename CDT::Finite_vertices_iterator CDT_Finite_vertices_iterator;
typedef typename CDT::Finite_edges_iterator CDT_Finite_edges_iterator;
typedef typename CDT::Locate_type CDT_Locate_type;
typedef Arr_point_location_result<Arrangement_2> Result;
typedef typename Result::Type Result_type;
// Support cpp11::result_of
typedef Result_type result_type;
protected:
typedef Arr_traits_basic_adaptor_2<Geometry_traits_2> Traits_adaptor_2;
// Data members:
const Traits_adaptor_2* m_traits; // Its associated traits object.
bool m_ignore_notifications;
bool m_ignore_remove_edge;
CDT m_cdt;
template<typename T>
Result_type make_result(T t) const { return Result::make_result(t); }
inline Result_type default_result() const { return Result::default_result(); }
public:
/*! Default constructor. */
Arr_triangulation_point_location() :
m_traits(nullptr),
m_ignore_notifications(false),
m_ignore_remove_edge(false)
{}
/*! Constructor from an arrangement.
* \param arr (in) The arrangement.
*/
Arr_triangulation_point_location(const Arrangement_2& arr) :
Arr_observer<Arrangement_2>(const_cast<Arrangement_2&>(arr)),
m_traits(static_cast<const Traits_adaptor_2*>(arr.geometry_traits())),
m_ignore_notifications(false),
m_ignore_remove_edge(false)
{ build_triangulation(); }
/*! Locate the arrangement feature containing the given point.
* \param p (in) The query point.
* \return An object representing the arrangement feature containing the
* query point. This object is either a Face_const_handle or a
* Halfedge_const_handle or a Vertex_const_handle.
*/
result_type locate(const Point_2& p) const;
//Observer functions that are relevant to overload
//-------------------------------------------------
/*! Attach an arrangement.
* \param arr (in) The arrangement.
*/
virtual void before_attach(const Arrangement_2& arr)
{ m_traits = static_cast<const Traits_adaptor_2*>(arr.geometry_traits()); }
virtual void after_attach() { build_triangulation(); }
virtual void before_detach() { clear_triangulation(); }
/// \name Overloaded observer functions on global changes.
//@{
/*! Notification after the arrangement has been assigned with another
* arrangement.
*/
virtual void after_assign()
{
clear_triangulation();
build_triangulation();
}
/*! Notification after the arrangement is cleared.
*/
virtual void after_clear()
{
clear_triangulation();
build_triangulation();
}
/*! Notification before a global operation modifies the arrangement.
*/
virtual void before_global_change()
{
clear_triangulation();
m_ignore_notifications = true;
}
/*! Notification after a global operation is completed.
*/
virtual void after_global_change()
{
build_triangulation();
m_ignore_notifications = false;
}
//@}
/// \name Overloaded observer functions on local changes.
//@{
/*! Notification before the removal of an edge.
* \param e (in) A handle to one of the twin halfedges to be removed.
*/
virtual void before_remove_edge(Halfedge_handle /* e */)
{ m_ignore_remove_edge = true; }
/*! Notification after the creation of a new vertex.
* \param v (in) A handle to the created vertex.
*/
virtual void after_create_vertex(Vertex_handle /* v */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after the creation of a new edge.
* \param e (in) A handle to one of the twin halfedges that were created.
*/
virtual void after_create_edge(Halfedge_handle /* e */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after an edge was split.
* \param e1 (in) A handle to one of the twin halfedges forming the first edge.
* \param e2 (in) A handle to one of the twin halfedges forming the second edge.
*/
virtual void after_split_edge(Halfedge_handle /* e1 */,
Halfedge_handle /* e2 */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after a face was split.
* \param f (in) A handle to the face we have just split.
* \param new_f (in) A handle to the new face that has been created.
* \param is_hole (in) Whether the new face forms a hole inside f.
*/
virtual void after_split_face(Face_handle /* f */,
Face_handle /* new_f */,
bool /* is_hole */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after an outer CCB was created inside a face.
* \param h (in) A circulator representing the boundary of the new outer CCB.
*/
virtual void after_add_outer_ccb(Ccb_halfedge_circulator /* h */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after an edge was merged.
* \param e (in) A handle to one of the twin halfedges forming the merged edge.
*/
virtual void after_merge_edge(Halfedge_handle /* e */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after a face was merged.
* \param f (in) A handle to the merged face.
*/
virtual void after_merge_face(Face_handle /* f */)
{
if (! m_ignore_notifications && ! m_ignore_remove_edge) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after an outer CCB is moved from one face to another.
* \param h (in) A circulator representing the boundary of the component.
*/
virtual void after_move_outer_ccb(Ccb_halfedge_circulator /* h */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notificaion before the removal of a vertex.
* \param v (in) A handle to the vertex to be deleted.
*/
virtual void after_remove_vertex()
{
if (! m_ignore_notifications && ! m_ignore_remove_edge) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification before the removal of an edge.
* \param e (in) A handle to one of the twin halfedges to be deleted.
*/
virtual void after_remove_edge()
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
m_ignore_remove_edge = false;
}
/*! Notification before the removal of an outer CCB.
* \param f (in) The face that used to own the outer CCB.
*/
virtual void after_remove_outer_ccb(Face_handle /* f */)
{
if (! m_ignore_notifications && ! m_ignore_remove_edge) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after an inner CCB was created inside a face.
* \param h (in) A circulator representing the boundary of the new inner CCB.
*/
virtual void after_add_inner_ccb(Ccb_halfedge_circulator /* h */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notification after an inner CCB is moved from one face to another.
* \param h (in) A circulator representing the boundary of the component.
*/
virtual void after_move_inner_ccb(Ccb_halfedge_circulator /* h */)
{
if (! m_ignore_notifications) {
clear_triangulation();
build_triangulation();
}
}
/*! Notificaion after the removal of an inner CCB.
* \param f (in) The face that used to contain the inner CCB.
*/
virtual void after_remove_inner_ccb(Face_handle /* f */)
{
if (! m_ignore_notifications && ! m_ignore_remove_edge) {
clear_triangulation();
build_triangulation();
}
}
// @}
protected:
/*! Locate the arrangement feature containing the given point in the
* unbounded face(s).
* \param p (in) The query point.
* \return An object representing the arrangement feature containing the
* query point. This object is either a Face_const_handle
* representing an unbounded face or a Vertex_const_handle
* representing an isolated vertex.
*/
result_type locate_in_unbounded(const Point_2& p) const;
void clear_triangulation();
void build_triangulation();
};
} //namespace CGAL
// The member-function definitions can be found under:
#include <CGAL/Arr_point_location/Arr_triangulation_pl_functions.h>
#include <CGAL/enable_warnings.h>
#endif