Delaunay三角测量:顶点存储Point_handle而不是Point



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

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

我的点类是从point_3派生而来的,包含一些信息(布尔值和int)。

为了做到这一点,我创建了一个自定义的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是顶点句柄。

在三角测量中插入点很好,但我在删除点时遇到了问题。我的自定义顶点类不正确吗?

有更好的方法吗?

--编辑-----

dt是Delaunay三角测量:

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;

--

@斯洛里奥:这是一个好的开始吗?

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

以下是我在Delaunay_triangulation:中使用我的point_handle作为点所做的操作

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

最新更新