实现文档
继承自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允许选择是否支持相交约束以及如何处理它们。
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 |
insert (PointIterator first, PointIterator last) 插入记录在容器[first,last)当中的顶点 |
template |
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 |
insert_constraint (PointIterator first, PointIterator last, bool close=false)插入由容器 [first,last) 中的点定义的折线。 |
template |
insert_constraints (ConstraintIterator first, ConstraintIterator last)插入容器[first,last)中记录的约束 |
template |
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。