0

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

};
Kamouth
  • 134
  • 2
  • 9
  • What is the variable `dt`, and how is it declared? – Some programmer dude Feb 14 '13 at 10:18
  • Next question, what does the `remove` function do? If you have problems with that function it would help actually showing it, and all relevant member variables used. – Some programmer dude Feb 14 '13 at 10:25
  • What is K? K needs to be a traits class you defined yourself with, among our things defined in the traits concept,K::Point_3 being your handle type – sloriot Feb 14 '13 at 10:35
  • K is CGAL::Filtered_kernel >. Is [this example](http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Kernel_23/Chapter_main.html#Section_11.5) relevant in order to change K::Point_3 to point_handle ? – Kamouth Feb 14 '13 at 11:47
  • No, you need to look at [this](http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Triangulation_3_ref/Concept_DelaunayTriangulationTraits_3.html) and the concept it refines [this](http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Triangulation_3_ref/Concept_TriangulationTraits_3.html). I think you don't need to provide the segment, tetrahedron and triangle types (they are needed for specific functions). Defining all the functors is easy, you simply need to forward the predicates to the Kernel you use. – sloriot Feb 14 '13 at 12:05
  • So basically I need to create a custom filtered_kernel (for example) with Point_handle define as Point_3 and define all the functors related to Point_3 in this class ? – Kamouth Feb 14 '13 at 13:21
  • Why isn't the extensible kernel example a way to solve my problem ? I found [this post](http://stackoverflow.com/questions/2418332/customizing-cgal-kernel-with-my-own-point-class) suggesting the extensible kernel as a solution. – Kamouth Feb 14 '13 at 15:59
  • Both solutions should work. – sloriot Feb 15 '13 at 06:13

1 Answers1

0

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();
}
};
Kamouth
  • 134
  • 2
  • 9