Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Storing Additional Information in CGAL Constrained Triangulation Face and Accessing it Using Finite Faces Iterator

I am using CGAL’s Constrained Delaunay Triangulation (Constrained_Delaunay_triangulation_2) to perform triangulation with constraints. I would like to store some additional information in each face of the constrained triangulation and then access this information while iterating over the finite faces.

I have tried to create a custom face base class derived from CGAL::Constrained_triangulation_face_base_2, but I am facing difficulties in accessing the additional information stored in the face using the Finite_faces_iterator.

Here is my attempt (including different types of casts like static, dynamic etc.):

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

class Constrained_triangulation_face_base_with_info_2 : public CGAL::Constrained_triangulation_face_base_2<EPIC> {
    
public:
    std::vector<Point2d> containedPoints;

    Constrained_triangulation_face_base_with_info_2() : containedPoints() {

    }

    virtual ~Constrained_triangulation_face_base_with_info_2() {}
};

// Constrained (!) Delaunay-Triangulierung
typedef CGAL::Triangulation_vertex_base_2<EPIC> VertexBase;
typedef CGAL::Triangulation_data_structure_2<VertexBase, Constrained_triangulation_face_base_with_info_2> TDS;
typedef CGAL::Constrained_Delaunay_triangulation_2<EPIC, TDS> ConstrainedDelaunayTriangulation;
typedef ConstrainedDelaunayTriangulation::Finite_faces_iterator ConstrainedDelaunayFacesIterator;

// ...

for (
    ConstrainedDelaunayFacesIterator fit = 
    constrainedDelaunayTriangulation.finite_faces_begin(), end = 
    constrainedDelaunayTriangulation.finite_faces_end();
    fit != end;
    ++fit
    ) {

    // Now how to cast/access the custom face base class derived from fit?!
}

I understand that the issue might be related to type casting, but I am unsure how to correctly access the additional information stored in Constrained_triangulation_face_base_with_info_2.

Could someone please guide me on how to store and access additional information in faces of CGAL’s constrained triangulation using Finite_faces_iterator? Any help or code example would be highly appreciated. Thank you!

>Solution :

The correct approach is that you don’t need to create a new face class. You can use the fact that Constrained_triangulation_face_base_2 has a template parameter allowing you pass the existing class Triangulation_face_base_with_info_2 as a base:

typedef CGAL::Triangulation_vertex_base_2<EPIC> Vb;
typedef std::vector<Point2d> My_info;
typedef CGAL::Triangulation_face_base_with_info_2<My_info, EPIC> Fbb;
typedef CGAL::Constrained_triangulation_face_base_2<EPIC, Fbb>;
typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;
typedef CGAL::Your_prefered_itag Itag;
typedef CGAL::Constrained_Delaunay_triangulation_2<EPIC, Tds, Itag> CDT;

[...]
for(auto fit =  cdt.finite_faces_begin(), end = cdt.finite_faces_end(); fit != end; ++fit) 
{
  fit->info().push_back(Point2d());
  // etc.
}

Just for completeness: if you want to derive your own vertex/face classes (which, again, you don’t need here as you can use existing CGAL classes), then you have to take care of the advanced rebinding mechanism, see https://doc.cgal.org/latest/TDS_2/index.html#title7.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading