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

实现文档<CGAL/Constrained_Delaunay_triangulation_2.h>
继承自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<Traits,Tds>。此外,有关三角剖分边的状态(受约束或不受约束)的信息存储在面中。因此,约束三角剖分的嵌套面类型提供了额外的功能来处理这些信息。这些附加功能对插入受约束的 Delaunay 三角剖分的三角剖分数据结构的基本面类产生了附加要求。受约束的 Delaunay 三角剖分的底面必须是概念ConstrainedTriangulationFaceBase_2 的模型。
    CGAL 为模板参数提供了一个默认值。 如果 Gt 是几何特征参数,则 ConstrainedTriangulationFaceBase_2 的默认值是类 Constrained_triangulation_face_base_2,三角数据结构参数的默认值是类 Triangulation_data_structure_2<CGAL::Triangulation_vertex_base_2, Constrained_triangulation_face_base_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_handleinsert (Point p, Face_handle f=Face_handle()) 在三角剖分中插入点 p,面 f 作为 p 位置的提示。
Vertex_handleinsert (const Point &p, Locate_type lt, Face_handle loc, int li)在由 (lt,loc,i) 给出的位置处插入点 p。
Vertex_handlepush_back (const Point &p) 相当于insert (p)
template <class PointIterator > std::ptrdiff_tinsert (PointIterator first, PointIterator last) 插入记录在容器[first,last)当中的顶点
template<class PointWithInfoIterator > std::ptrdiff_tinsert (PointWithInfoIterator first, PointWithInfoIterator last) 插入迭代器容器[first,last)中顶点
voidinsert_constraint (Point a, Point b) 在三角剖分中插入线段 ab 作为约束
voidpush_back (const std::pair< Point, Point > &c)在三角剖分中插入线段 ab 作为约束,其中点a,b作为pair c的两个元素进行记录
voidinsert_constraint (Vertex_handle va, Vertex_handle vb)在三角剖分中插入端点为顶点 va 和 vb 的线段作为约束
template<class PointIterator > voidinsert_constraint (PointIterator first, PointIterator last, bool close=false)插入由容器 [first,last) 中的点定义的折线。
template<class ConstraintIterator > std::size_tinsert_constraints (ConstraintIterator first, ConstraintIterator last)插入容器[first,last)中记录的约束
template<class PointIterator , class IndicesIterator > std::size_tinsert_constraints (PointIterator points_first, PointIterator points_last, IndicesIterator indices_first, IndicesIterator indices_last)与上面相同,只是每个约束都作为容器[points_first, points_last) 中的点的一对索引给出
voidremove (Vertex_handle &v) 删除顶点 v。
voidremove_incident_constraints (Vertex_handle v)使得与顶点v邻接的边都成为不受约束的边
voidremove_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。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CGAL (Computational Geometry Algorithms Library) 是一个C ++库,提供了许多计算几何算法的实现。其中之一是Delaunay 三角剖分算法,可以通过CGAL库进行实现。 要使用CGAL实现Delaunay 三角剖分,需要定义一些约束条件来限制三角剖分的结果。这些约束条件可以是点、直线、圆或球。在CGAL中,可以使用不同的约束类型来定义这些约束条件,例如Point_2,Line_2,Circle_2等。 一旦定义了约束条件,可以使用CGALDelaunay_triangulation_2类来计算Delaunay三角剖分。该类提供了一些函数来插入点、删除点、查询最近邻点、查询包含点的三角形和边界等功能。 下面是一个简单的示例代码,演示如何使用CGAL实现Delaunay 三角剖分: ```c++ #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Delaunay_triangulation_2.h> typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Delaunay_triangulation_2<K> Delaunay; int main() { Delaunay dt; dt.insert(K::Point_2(0, 0)); dt.insert(K::Point_2(1, 0)); dt.insert(K::Point_2(0, 1)); dt.insert(K::Point_2(1, 1)); std::cout << "Number of vertices: " << dt.number_of_vertices() << std::endl; std::cout << "Number of triangles: " << dt.number_of_faces() << std::endl; return 0; } ``` 该代码创建了一个Delaunay_triangulation_2对象,并插入了四个点。然后,它打印出了三角形和顶点的数量。 需要注意的是,这只是一个简单的示例,实际上,CGAL提供了更多的功能和选项来控制Delaunay 三角剖分的行为。例如,可以定义不同的距离函数来计算点之间的距离,或者使用其他类型的约束来定义三角剖分

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值