Search code examples
cgal

Delaunay triangulation: vertex storing Point_handle instead of Point


I am storing points in a custom container and I would like to build the Delaunay triangulation on a subset of these points.

As the points already exist in the container I don't want the Delaunay triangulation to store copies of these points.

My point class is derived from Point_3 and contains several informations (booleans and ints).

In order to do that, I created a custom triangulation_vertex class :

template < typename GT, typename Pt, typename DSVb = Triangulation_ds_vertex_base_3<> >
class Convection_vertex : public DSVb
{
public:

  typedef typename DSVb::Cell_handle Cell_handle;

  typedef GT Geom_traits;
  typedef typename GT::Point_3 Point;
  typedef typename Pt::Point_handle Point_handle;    

template < typename TDS2 >
struct Rebind_TDS {
  typedef typename DSVb::template Rebind_TDS<TDS2>::Other DSVb2;
  typedef Convection_vertex<GT, Pt, DSVb2> Other;
};

private:
  static int rank_id;
  int number_id;
  bool discovered;

  Point_handle _ph;

public:
  Convection_vertex() : DSVb(), number_id(rank_id++), discovered(false) {}

  Convection_vertex(const Point_handle& p) : DSVb(), _ph(p), number_id(rank_id++),   discovered(false) {}

  Convection_vertex(const Point_handle& p, const Cell_handle& c) : DSVb(c), _ph(p), number_id(rank_id++), discovered(false) {}

  Convection_vertex(const Cell_handle& c) : DSVb(c), number_id(rank_id++), discovered(false) {}

  const Point& point() const
  { return (*_ph); }

  Point& point()
  { return (*_ph); }

  void set_point(const Point& p){ }

  void set_point(const Point_handle& ph)
  { _ph = ph; }

   void set_point_handle(Point_handle ph)
  { _ph = ph; }

  const Point_handle& point_handle() const
  { return _ph; }

  Point_handle& point_handle()
  { return _ph; }
};

To insert a point in the Delaunay triangulation I do:

DVertex_handle dvh = dt.insert(*p);
dvh->set_point_handle(p);

Where p is a point_handle (ie My_point*).

To delete a point in the Delaunay triangulation I do:

dt.remove(dvh);

where dvh is a vertex_handle.

Inserting points in the triangulation is working fine, but I'm having issues removing points. Is my custom vertex class incorrect ?

Is there a better way to do that ?

--edit-----

dt is the Delaunay triangulation:

typedef CGAL::Convection_vertex<K,Point> Conv_Vb3d;
typedef CGAL::Convection_cell<K> Ce3d;
typedef CGAL::Triangulation_data_structure_3<Conv_Vb3d,Ce3d > Tds3d;
typedef CGAL::Delaunay_triangulation_3<K,Tds3d > Dh;

Dh dt;

--

@sloriot: Is this a good start ?

template < typename CK, bool UseStaticFilters, typename Pt >
struct Convection_traits
  : public Filtered_kernel_adaptor<
           Type_equality_wrapper<
               typename CK:: template Base< Convection_traits<CK, UseStaticFilters,Pt> >::Type,
               Convection_traits<CK, UseStaticFilters,Pt> >,
           UseStaticFilters >
{
    typedef Pt Point_3;

    [...] // functors

};

Solution

  • Here is what I have done to use my point_handle as point in the Delaunay_triangulation:

    template < typename K_, typename Pt >   
    class My_traits
    {
    
      K_ K;  
    
     public:
      typedef Pt Point_3;
      typedef My_traits<K_, Pt> Self;
    
    //triangulation traits
    
    typedef typename K_::Segment_3 Segment_3;
    typedef typename K_::Tetrahedron_3 Tetrahedron_3;
    typedef typename K_::Triangle_3 Triangle_3;
    
    typedef typename K_::Construct_segment_3 Construct_segment_3;
    typedef typename K_::Construct_triangle_3 Construct_triangle_3;
    typedef typename K_::Construct_tetrahedron_3 Construct_tetrahedron_3;
    
    typedef typename K_::Compare_xyz_3 Compare_xyz_3;
    typedef typename K_::Coplanar_orientation_3 Coplanar_orientation_3;
    typedef typename K_::Orientation_3 Orientation_3;
    
    Construct_tetrahedron_3 construct_tetrahedron_3_object () const{
        return K.construct_tetrahedron_3_object ();
    }
    Construct_triangle_3 construct_triangle_3_object () const{
        return K.construct_triangle_3_object ();
    }
    Construct_segment_3 construct_segment_3_object () const{
        return K.construct_segment_3_object ();
    }
    Compare_xyz_3 compare_xyz_3_object () const{
        return K.compare_xyz_3_object ();
    }
    Coplanar_orientation_3 coplanar_orientation_3_object () const{
        return K.coplanar_orientation_3_object ();
    }
    Orientation_3 orientation_3_object () const{
        return K.orientation_3_object ();
    }
    
    //delaunay triangulation traits
    
    typedef typename K_::Line_3 Line_3;
    typedef typename K_::Object_3 Object_3;
    typedef typename K_::Ray_3 Ray_3;
    
    typedef typename K_::Coplanar_side_of_bounded_circle_3 Coplanar_side_of_bounded_circle_3;
    typedef typename K_::Side_of_oriented_sphere_3 Side_of_oriented_sphere_3;
    typedef typename K_::Compare_distance_3 Compare_distance_3;
    
    Coplanar_side_of_bounded_circle_3 coplanar_side_of_bounded_circle_3_object() const{
        return K.coplanar_side_of_bounded_circle_3_object();
    }
    Side_of_oriented_sphere_3 side_of_oriented_sphere_3_object() const{
        return K.side_of_oriented_sphere_3_object();
    }
    Compare_distance_3 compare_distance_3_object() const{
        return K.compare_distance_3_object();
    }
    };