CGAL-约束德劳内三角剖分(Constrained_Delaunay_triangulation_2)

实现文档
继承自CGAL::Constrained_triangulation_2< Traits, Tds, Itag >.

定义

受约束的 Delaunay 三角剖分是具有约束边的三角剖分,它试图尽可能多地成为 Delaunay三角形。
约束边不一定是 Delaunay 边,因此约束 Delaunay 三角剖分不是 严格意义上的Delaunay 三角剖分。受约束的 Delaunay 是一种三角剖分,其面不一定满足空圆属性,而是满足称为受约束空圆的较弱属性。为了说明这个属性,将受约束的边缘视为阻挡视图是很方便的。然后,如果任何三角形面的外接圆在其内部不包括从三角形内部可见的顶点,则三角剖分受到约束。
与约束三角剖分的情况一样,根据用户是否希望处理相交的输入约束,提供三种不同版本的 Delaunay 约束三角剖分。

模板参数

Traits是约束 Delaunay 三角剖分的几何特征(实际上就是cgal的一个数据核)。它必须是 DelaunayTriangulationTraits_2 的模型,提供 Delaunay 三角剖分的 side_of_orient_circle 测试。当支持输入约束的交集时,几何特征类需要提供额外的函数对象类型来计算两个线段的交集。 然后必须也是概念ConstrainedTriangulationTraits_2的模型。
Tds须是 TriangulationDataStructure_2 或默认的模型。
Itag允许选择是否支持相交约束以及如何处理它们。

  • No_constraint_intersection_tag如果不允许输入约束的交集,除了单个公共端的配置;
  • No_constraint_intersection_requiring_constructions_tag 除非不需要实际构造来表示交集,不允许输入约束的交集。例如,如果两个约束在类似“T”的连接处相交,则相交点是约束的极端之一,因此实际上不需要构造。其他类似的配置包括重叠段、公共末端或相等约束。
  • Exact_predicates_tag 允许输入约束之间的交集,并且当traits类提供精确的预测子以及交点的近似构造时使用;
  • Exact_intersections_tag 允许输入约束之间的交集,并与精确算术类型结合使用。
    有约束的 Delaunay 三角剖分不是 Delaunay 三角剖分,但它是有约束的三角剖分。因此,类 Constrained_Delaunay_triangulation_2 派生自类 Constrained_triangulation_2。此外,有关三角剖分边的状态(受约束或不受约束)的信息存储在面中。因此,约束三角剖分的嵌套面类型提供了额外的功能来处理这些信息。这些附加功能对插入受约束的 Delaunay 三角剖分的三角剖分数据结构的基本面类产生了附加要求。受约束的 Delaunay 三角剖分的底面必须是概念ConstrainedTriangulationFaceBase_2 的模型。
    CGAL 为模板参数提供了一个默认值。 如果 Gt 是几何特征参数,则 ConstrainedTriangulationFaceBase_2 的默认值是类 Constrained_triangulation_face_base_2,三角数据结构参数的默认值是类 Triangulation_data_structure_2。 默认交叉点标记是 No_constraint_intersection_requiring_constructions_tag。

构造函数

Constrained_Delaunay_triangulation_2 (const Traits &t=Traits())

引入空约束 Delaunay 三角剖分 cdt,即空构造函数。

Constrained_Delaunay_triangulation_2 (const Constrained_Delaunay_triangulation_2 &cdt1)

复制构造函数:复制所有面和顶点,复制边的约束状态

template<class ConstraintIterator >
 	Constrained_Delaunay_triangulation_2 (ConstraintIterator first, ConstraintIterator last, const Traits &t=Traits())

通过调用 insert_constraints(first, last) 构建一个约束在 [first,last) 范围内的约束三角剖分。

插入以及移除

以下成员函数覆盖基类的相应成员,以包括在修改三角剖分后恢复 Delaunay 约束属性的步骤。

返回值类型 函数声明及释义
Vertex_handle insert (Point p, Face_handle f=Face_handle()) 在三角剖分中插入点 p,面 f 作为 p 位置的提示。
Vertex_handle insert (const Point &p, Locate_type lt, Face_handle loc, int li)在由 (lt,loc,i) 给出的位置处插入点 p。
Vertex_handle push_back (const Point &p) 相当于insert (p)
template std::ptrdiff_t insert (PointIterator first, PointIterator last) 插入记录在容器[first,last)当中的顶点
template std::ptrdiff_t insert (PointWithInfoIterator first, PointWithInfoIterator last) 插入迭代器容器[first,last)中顶点
void insert_constraint (Point a, Point b) 在三角剖分中插入线段 ab 作为约束
void push_back (const std::pair< Point, Point > &c)在三角剖分中插入线段 ab 作为约束,其中点a,b作为pair c的两个元素进行记录
void insert_constraint (Vertex_handle va, Vertex_handle vb)在三角剖分中插入端点为顶点 va 和 vb 的线段作为约束
template void insert_constraint (PointIterator first, PointIterator last, bool close=false)插入由容器 [first,last) 中的点定义的折线。
template std::size_t insert_constraints (ConstraintIterator first, ConstraintIterator last)插入容器[first,last)中记录的约束
template std::size_t insert_constraints (PointIterator points_first, PointIterator points_last, IndicesIterator indices_first, IndicesIterator indices_last)与上面相同,只是每个约束都作为容器[points_first, points_last) 中的点的一对索引给出
void remove (Vertex_handle &v) 删除顶点 v。
void remove_incident_constraints (Vertex_handle v)使得与顶点v邻接的边都成为不受约束的边
void remove_constraint (const Face_handle &f, int i)使得边(f,i)成为不受约束的边

查询

以下模板成员函数查询与点 p 冲突的面集。
冲突的概念在这里指的是受约束的 Delaunay 设置,其含义如下。受约束的边被认为是可见性障碍,并且点 p 被认为与面 f 冲突,只要它从 f 的内部可见并且包含在 f 的外接圆中。

template<class OutputItFaces , class OutputItBoundaryEdges >
std::pair< OutputItFaces, OutputItBoundaryEdges >
get_conflicts_and_boundary (const Point &p, OutputItFaces fit, OutputItBoundaryEdges eit, Face_handle start) const

将点 p 的冲突区域的面和边界边输出到输出迭代器中

template<class OutputItFaces >
OutputItFaces get_conflicts (const Point &p, OutputItFaces fit, Face_handle start) const

将点 p 的冲突区域的面输出到输出迭代器中。

template<class OutputItBoundaryEdges >
OutputItBoundaryEdges  get_boundary_of_conflicts (const Point &p, OutputItBoundaryEdges eit, Face_handle start) const

将点 p 的冲突区域的边界边输出到输出迭代器。

检查

bool 	is_valid () const

检查三角剖分是否有效,以及每个受约束边是否在其两个入射面中始终标记为受约束。

翻转(边的翻转)

bool 	is_flipable (Face_handle f, int i) const

确定边缘 (f,i) 是否可以翻转。

void 	flip (Face_handle &f, int i)

这是一个高级功能。

void 	propagating_flip (List_edges &edges)

通过翻转边缘使三角剖分约束 Delaunay。

你可能感兴趣的:(CGAL学习,c++)