0

我将点存储在自定义容器中,我想在这些点的子集上构建 Delaunay 三角剖分。

由于容器中已经存在这些点,我不希望 Delaunay 三角剖分存储这些点的副本。

我的点类是从 Point_3 派生的,包含几个信息(布尔值和整数)。

为此,我创建了一个自定义 triangulation_vertex 类:

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; }
};

要在 Delaunay 三角剖分中插入一个点,我会:

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

其中 p 是一个 point_handle(即 My_point*)。

要删除 Delaunay 三角剖分中的一个点,我会:

dt.remove(dvh);

其中 dvh 是一个 vertex_handle。

在三角剖分中插入点工作正常,但我在删除点时遇到问题。我的自定义顶点类不正确吗?

有更好的方法吗?

--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

};
4

1 回答 1

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();
}
};
于 2013-02-21T09:52:14.237 回答