Skip to content

File ConstraintDelaunayTriangulation.h

File List > detail > triangulate > ConstraintDelaunayTriangulation.h

Go to the documentation of this file

// Copyright (c) 2012-2013, IGN France.
// Copyright (c) 2012-2022, Oslandia.
// SPDX-License-Identifier: LGPL-2.0-or-later

#ifndef _SFCGAL_TRIANGULATE_CONSTRAINTDELAUNAYTRIANGULATION_H_
#define _SFCGAL_TRIANGULATE_CONSTRAINTDELAUNAYTRIANGULATION_H_

#include <boost/optional.hpp>

#include "SFCGAL/Coordinate.h"
#include "SFCGAL/config.h"

#include <CGAL/Constrained_Delaunay_triangulation_2.h>
#include <CGAL/Triangulation_face_base_with_info_2.h>
#include <CGAL/Triangulation_vertex_base_with_info_2.h>

namespace SFCGAL {
class TriangulatedSurface;
}

namespace SFCGAL {
namespace triangulate {

class SFCGAL_API ConstraintDelaunayTriangulation {
public:
  struct VertexInfo {
    VertexInfo() : original() {}
    Coordinate original;
  };

  struct FaceInfo {
    FaceInfo() : nestingLevel(-1) {}
    int nestingLevel;

    bool
    in_domain()
    {
      return nestingLevel % 2 == 1;
    }
  };

  typedef CGAL::Triangulation_vertex_base_with_info_2<VertexInfo, Kernel>
      Triangulation_vertex_base;
  typedef CGAL::Triangulation_face_base_with_info_2<FaceInfo, Kernel>
      Triangulation_face_base;
  typedef CGAL::Constrained_triangulation_face_base_2<Kernel,
                                                      Triangulation_face_base>
      Constrained_triangulation_face_base;
  typedef CGAL::Triangulation_data_structure_2<
      Triangulation_vertex_base, Constrained_triangulation_face_base>
      Triangulation_data_structure;

  typedef CGAL::Constrained_Delaunay_triangulation_2<
      Kernel, Triangulation_data_structure, CGAL::Exact_predicates_tag>
      CDT;

  typedef CDT::Vertex_handle         Vertex_handle;
  typedef CDT::Face_handle           Face_handle;
  typedef CDT::All_faces_iterator    All_faces_iterator;
  typedef CDT::Finite_faces_iterator Finite_faces_iterator;

  ConstraintDelaunayTriangulation();

  Vertex_handle
  addVertex(const Coordinate &position);
  void
  addConstraint(Vertex_handle source, Vertex_handle target);

  void
  clear();

  size_t
  numVertices() const;
  size_t
  numTriangles() const;

  inline bool
  hasProjectionPlane() const
  {
    return _projectionPlane.is_initialized();
  }
  void
  setProjectionPlane(const Kernel::Plane_3 &projectionPlane);
  Kernel::Plane_3
  projectionPlane() const;

  inline bool
  isInfinite(Vertex_handle vertex) const
  {
    return _cdt.is_infinite(vertex);
  }
  inline bool
  isInfinite(Face_handle face) const
  {
    return _cdt.is_infinite(face);
  }

  void
  getTriangles(TriangulatedSurface &triangulatedSurface,
               bool                 filterExteriorParts = false) const;
  std::unique_ptr<TriangulatedSurface>
  getTriangulatedSurface() const;

  inline Finite_faces_iterator
  finite_faces_begin() const
  {
    return _cdt.finite_faces_begin();
  }
  inline Finite_faces_iterator
  finite_faces_end() const
  {
    return _cdt.finite_faces_end();
  }

  inline All_faces_iterator
  all_faces_begin() const
  {
    return _cdt.all_faces_begin();
  }
  inline All_faces_iterator
  all_faces_end() const
  {
    return _cdt.all_faces_end();
  }

  void
  markDomains();

  inline CDT &
  cdt()
  {
    return _cdt;
  }
  inline const CDT &
  cdt() const
  {
    return _cdt;
  }

private:
  CDT _cdt;
  boost::optional<Kernel::Plane_3> _projectionPlane;
};

} // namespace triangulate
} // namespace SFCGAL

#endif