Beaker
Beaker

Reputation: 199

Issue with CGAL 3D periodic Delaunay triangulation with info

I want to construct a periodic 3D Delaunay triangulation with info (in this case an integer) using CGAL. For 2D this works well if I construct a vector of pairs (point, info) and pass it to the triangulation function. The very analogous code for 3D won't compile however. Below is an example, where points from my own format "particle" are converted to the CGAL point format.

Is this an issue with CGAL or am I missing something?

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Periodic_3_Delaunay_triangulation_traits_3.h>
#include <CGAL/Periodic_3_Delaunay_triangulation_3.h>
#include <CGAL/Triangulation_vertex_base_with_info_3.h>
#include <CGAL/periodic_3_triangulation_3_io.h>

#include <iostream>
#include <fstream>
#include <cassert>
#include <list>
#include <vector>

typedef CGAL::Exact_predicates_inexact_constructions_kernel            K;
typedef CGAL::Periodic_3_Delaunay_triangulation_traits_3<K>            Gt;

typedef CGAL::Periodic_3_triangulation_ds_vertex_base_3<>              VbDS;
typedef CGAL::Triangulation_vertex_base_3<Gt, VbDS>                    Vb;
typedef CGAL::Triangulation_vertex_base_with_info_3<unsigned, Gt, Vb>  VbInfo;

typedef CGAL::Periodic_3_triangulation_ds_cell_base_3<>                CbDS;
typedef CGAL::Triangulation_cell_base_3<Gt, CbDS>                      Cb;

typedef CGAL::Triangulation_data_structure_3<VbInfo, Cb>               Tds;

typedef CGAL::Delaunay_triangulation_3<K, Tds>                         DT3;
typedef CGAL::Periodic_3_Delaunay_triangulation_3<Gt, Tds>             P3DT3;

typedef P3DT3::Point               Point;
typedef P3DT3::Iso_cuboid          Iso_cuboid;

void create_PDT_3D(const std::vector<particle>& grid )
{
     // The cube for the periodic domain
     Iso_cuboid domain(0,0,0,1,1,1); 

     // Convert "particle" format to "point with info" format
     std::vector<Point> points_bare;
     std::vector< std::pair<Point,unsigned> > points_info;

     points_bare.reserve(grid.size());
     points_info.reserve(grid.size());

     // the "info" is just given by the index of the point
     for (unsigned i = 0; i < grid.size(); ++i )
     {
          points_bare.emplace_back( Point(grid[i].x, grid[i].y, grid[i].z) );
          points_info.emplace_back( std::make_pair( Point(grid[i].x, grid[i].y, grid[i].z), i ) );
     }

     // Triangulate
     DT3 Ta    ( points_bare.begin(), points_bare.end() );         // working
     DT3 Tb    ( points_info.begin(), points_info.end() );         // working

     // Triangulate (periodic)
     P3DT3 TTa ( points_bare.begin(), points_bare.end(), domain ); // working
     P3DT3 TTb ( points_info.begin(), points_info.end(), domain ); // NOT working
}

where "particle" is a very simple class

class particle
{
     public:
          double x, y, z;
          particle(double xr=0, double yr=0, double zr=0) : x(xr), y(yr), z(zr) {};
};

Upvotes: 1

Views: 112

Answers (1)

Mael
Mael

Reputation: 595

The 3D periodic triangulations in CGAL do not have the necessary code to insert ranges of points with info. It is not because of a strong obstacle making it impossible to implement, it simply just was not done.

It should however be almost immediate to translate the code from the 2D periodic triangulations to the 3D case: you can look at the function insert_with_info() and how it is used in the class Periodic_2_Delaunay_triangulation_2. The code will be almost identical for 3D.

Let me know how it goes, and if you need help.

Upvotes: 3

Related Questions