CGAL-三角化的数据结构(tds_2)

定义

概念 TriangulationDataStructure_2 描述了带有两个模板参数的基本三角剖分类 Triangulation_2<Traits,Tds> 和所有其他所有二维三角剖分类要求。
这个概念可以看作是三角剖分面和顶点的容器。 概念 TriangulationDataStructure_2 包括两个子概念 TriangulationDataStructure_2::Vertex 和 TriangulationDataStructure_2::Face。
TriangulationDataStructure_2 维护顶点和面之间的关联和邻接关系。所以这种数据结构与半边结构是不同的。
每个三角形面都可以访问其三个入射顶点及其三个相邻面。 每个顶点都可以访问其一个入射面,并通过该面访问其入射面的循环列表。由此可知这样的一种表示方式是一种基于面的数据结构!
面的三个顶点用 0、1 和 2 进行索引。面的邻居也用 0、1 和 2 进行索引,这样,由 i 索引的邻居与具有相同索引的顶点相对 .(这里画个图就很好理解了。如图所示,面片f的邻居0面片是g,它们的公共边是面片f中顶点f0所对的边。
在这里插入图片描述
据此,每条边都有两个隐式表示:与面 f 中索引为 i 的顶点相对的边,同时可以表示为 f 的邻居(i)的边。
三角剖分数据结构负责三角剖分的组合完整性。 这意味着三角剖分数据结构允许对三角剖分执行一些组合操作,并保证顶点和面之间保持适当的关联和邻接关系。 术语组合操作意味着这些操作纯粹是拓扑的,不依赖于几何嵌入。 在给定面或给定边中插入新顶点、抑制三阶顶点、翻转两条边是组合操作的示例。

输入输出(I/O)

iostream中输出的信息是:维度、(有限)顶点数、(有限)面数。然后是每个顶点,如果有的话,存储在该顶点中的非组合信息。然后是每个面,其顶点的索引和存储在该面中的非组合信息(如果有的话)。然后对于每个面再次出现相邻面的索引。一个项目的索引(面的顶点)这个项目在输出顺序中的排名。
当维度 < 2 时,对于最大维度的面而不是面输出相同的信息。

声明原型

CGAL::Triangulation_data_structure_2<Vb,Fb>
在声明一个Triangulation_data_structure_2,需要首先声明两个模板类型,vb以及fb,即顶点类型和面片类型。

相关的类型

TriangulationDataStructure_2::Face
TriangulationDataStructure_2::Vertex
CGAL::Triangulation_2

相关的概念

面片 概念 TriangulationDataStructure_2::Face 描述了用于存储 TriangulationDataStructure_2 的面类的类型。 TriangulationDataStructure_2::Face 存储三个指向其三个顶点的句柄和三个指向其三个邻居的句柄。 顶点按逆时针顺序索引为 0、1 和 2。 索引为 i 的邻居与顶点 i 相对。
面片数据 使用三角剖分数据结构的各种算法,例如 Delaunay 三角剖分或 Alpha Shapes,必须能够将状态与面元素相关联。 为了提高效率,这些信息必须直接存储在面片中。
顶点 概念 TriangulationDataStructure_2::Vertex 描述了 TriangulationDataStructure_2 用于存储顶点的类型。

数据类型

声明类型数据类型实际描述
typedef unspecified_typesize_type无符号整数类型
typedef unspecified_typedifference_type有符号整数类型
typedef unspecified_typeVertex顶点类型,该类型的要求在概念 TriangulationDataStructure_2::Vertex 中描述。
typedef unspecified_typeFace面类型,这种类型的要求在概念 TriangulationDataStructure_2::Face 中描述。
typedef unspecified_typeFace_data面片数据类型,要求在 TriangulationDataStructure_2::Face_data 中描述。
typedef unspecified_typeVertex_handle顶点句柄
typedef unspecified_typeFace_handle面片句柄
typedef std::pair< Face_handle, int >Edge边的数据类型,面片句柄和整数(顶点索引)的绑定

迭代器以及循环器

迭代器允许访问三角数据结构的所有顶点、边和面。
循环器允许访问入射到给定顶点的所有边或面以及与给定顶点相邻的所有顶点。
迭代器和循环器是双向的且不可变的,它们可以转换为相应的句柄,因此它们可以作为参数直接传递给需要句柄的函数。
循环器以及迭代器的失效情形。面循环器因其指向的面的任何修改而无效。 对入射到所指向的边的两个面中的任何一个进行任何修改,都会使边循环器无效。 一个围绕顶点 v 旋转并且具有顶点 w 的句柄作为值的顶点循环器,由于对与 v 和 w 相关的两个面中的任何一个的任何修改而无效。

声明类型迭代器与循环器
typedef unspecified_typeFace_iterator
typedef unspecified_typeEdge_iterator
typedef unspecified_typeVertex_iterator
typedef unspecified_typeFace_circulator
typedef unspecified_typeEdge_circulator
typedef unspecified_typeVertex_circulator

创建

TriangulationDataStructure_2 ()默认构造函数
TriangulationDataStructure_2 (const TriangulationDataStructure_2 &tds1)拷贝构造函数,实现深度的拷贝,即复制了所有的顶点以及面片
TriangulationDataStructure_2 &operator= (const TriangulationDataStructure_2 &tds1)重载运算符
Vertex_handlecopy_tds (const TriangulationDataStructure_2 &tds1, Vertex_handle v=Vertex_handle()) tds1被拷贝进了一个三角化的数据结构当中
template<class TDS_src , class ConvertVertex , class ConvertFace > Vertex_handlecopy_tds (const TDS_src &tds_src, typename TDS_src::Vertex_handle v, const ConvertVertex &convert_vertex, const ConvertFace &convert_face)tds_src被拷贝到了this中
voidswap (TriangulationDataStructure_2 &tds1)和tds_1交换三角化数据结构的内容
voidclear ()删除所有面和所有有限顶点。

访问函数

返回数据类型函数原型
intdimension () const这是一个高级功能。
size_typenumber_of_vertices () const返回三角剖分数据结构中的顶点数。
size_typenumber_of_faces () const返回三角剖分数据结构中二维面的数量。
size_typenumber_of_edges () const返回三角剖分数据结构中的边数。
size_typenumber_of_full_dim_faces () const 返回全维度面的数量,即维度等于三角数据结构维度的面。

设置函数

void set_dimension(int n)设置维度

查询函数

返回值类型函数原型及解析
boolis_vertex (Vertex_handle v) const 如果 v 是三角剖分数据结构的顶点,则返回 true。
boolis_edge (Face_handle fh, int i) const 如果 (fh,i) 是三角剖分数据结构的边,则返回 true。
boolis_edge (Vertex_handle va, Vertex_handle vb) const 如果 (va, vb) 是三角剖分数据结构的边,则返回 true。
boolis_edge (Vertex_handle va, Vertex_handle vb, Face_handle &fr, int &i) const 如果 (va, vb) 是三角剖分数据结构的边,则返回 true。
boolis_face (Face_handle fh) const 如果 fh 是三角测量数据结构的一个面,则返回 true。
boolis_face (Vertex_handle v1, Vertex_handle v2, Vertex_handle v3) const如果存在具有 v1、v2 和 v3 作为顶点的面,则为 true。
boolis_face (Vertex_handle v1, Vertex_handle v2, Vertex_handle v3, Face_handle &fr) const 如果存在具有 v1、v2 和 v3 作为顶点的面,则为 true。

遍历三角剖分

返回值类型函数原型及释义
Face_iteratorfaces_begin () const访问所有的面片
Face_iteratorfaces_end () const
Vertex_iteratorvertices_begin () const访问所有的顶点
Vertex_iteratorvertices_end () const
Edge_iteratoredges_begin () const访问所有的边
Edge_iteratoredges_end () const
Vertex_circulatorincident_vertices (Vertex_handle v, Face_handle f=Face_handle()) const
Edge_circulatorincident_edges (Vertex_handle v, Face_handle f=Face_handle()) const
Face_circulatorincident_faces (Vertex_handle v, Face_handle f=Face_handle()) const
Vertex_handlemirror_vertex (Face_handle f, int i) const返回 f->neighbor(i) 的顶点。
intmirror_index (Face_handle f, int i) const返回 f 的索引作为 f->neighbor(i) 的邻居。
Edgemirror_edge (Edge e) const返回从另一个相邻面看到的相同边。

修改算子

返回值类型函数原型
voidflip (Face_handle f, int i) 将入射到 f 和 f->neighbor(i) 的边与 f 和 f->neighbor(i) 形成的四边形的另一个对角线交换。(边的翻转)
Vertex_handleinsert_first ()创建第一个顶点并返回一个句柄。
Vertex_handleinsert_second ()创建第二个顶点并返回一个句柄。
Vertex_handleinsert_in_edge (Face_handle f, int i)添加面 f 的顶点 v 分裂边 i。
Vertex_handleinsert_in_face (Face_handle f)添加一个顶点 v 将面 f 一分为三。
Vertex_handleinsert_dim_up (Vertex_handle w, bool orient=true)添加一个顶点 v,将三角剖分数据结构的维度增加一。
voidremove_degree_3 (Vertex_handle v, Face_handle f=Face_handle())删除 3 阶的顶点。
voidremove_second (Vertex_handle v)删除倒数第二个顶点
voidremove_first (Vertex_handle v)删除最后一个顶点
voidremove_dim_down (Vertex_handle v) 删除与所有其他顶点相关的顶点 v 并将三角剖分数据结构的维度减少一维。
voiddim_down (Face_handle f, int i) 一定是在顶点的替换导致三角剖分数据的维度降低时调用

高级的修改算子

为方便高级用户,需要以下修改算子。
它们不保证生成的三角剖分数据结构的组合有效性。

模板类型以及返回值类型函数声明及释义
template<class FaceIt > Vertex_handleinsert_in_hole (FaceIt face_begin, FaceIt face_end)创建一个新的顶点 v 并用它来标记一个洞。
template<class FaceIt > voidinsert_in_hole (Vertex_handle new_v, FaceIt face_begin, FaceIt face_end)与上面相同,除了 new_v 将用作新顶点,它必须是先前分配的,例如使用 create_vertex。
template<class EdgeIt > Vertex_handlestar_hole (EdgeIt edge_begin, EdgeIt edge_end)创建一个新的顶点 v 并使用它来为边界由边序列 [edge_begin, edge_end) 描述的洞进行标记。
template<class EdgeIt , class FaceIt > Vertex_handlestar_hole (EdgeIt edge_begin, EdgeIt edge_end, FaceIt face_begin, FaceIt face_end)与上面相同,只是为了构建新的面片序列,算法首先循环序列 [face_begin, face_end) 中的面片,并在序列耗尽时创建新面片。
template<class EdgeIt > voidstar_hole (Vertex_handle v, EdgeIt edge_begin, EdgeIt edge_end)使用顶点 v 为边界由边序列 [edge_begin, edge_end) 描述的洞进行标记。
template<class EdgeIt , class FaceIt > voidstar_hole (Vertex_handle v, EdgeIt edge_begin, EdgeIt edge_end, FaceIt face_begin, FaceIt face_end)同上,按顺序遍历面片 [face_begin, face_end)
voidmake_hole (Vertex_handle v, List_edges &hole)删除顶点 v,并将孔边界上的边列表存储在孔中。
Vertex_handlecreate_vertex ()添加一个新顶点。
Face_handlecreate_face (Face_handle f1, int i1, Face_handle f2, int i2, Face_handle f3, int i3)添加一个面,它是 f1 的i1邻居 、f2 的 i2 邻居 和 f3 的 i3邻居 。
Face_handlecreate_face (Face_handle f1, int i1, Face_handle f2, int i2)添加一个面,它是 f1 的邻居 i1 和 f2 的邻居 i2。
Face_handlecreate_face (Face_handle f1, int i1, Vertex_handle v)添加一个面,它是 f1 的邻居 i1,并以 v 作为顶点。
Face_handlecreate_face (Vertex_handle v1, Vertex_handle v2, Vertex_handle v3)添加具有顶点 v1、v2 和 v3 的面。
Face_handlecreate_face (Vertex_handle v1, Vertex_handle v2, Vertex_handle v3, Face_handle f1, Face_handle f2, Face_handle f3)添加一个具有顶点 v1、v2 和 v3 以及邻居 f1、f2、f3 的面。
Face_handlecreate_face ()添加一个面,其顶点和邻居设置为 Vertex_handle() 和 Face_handle()。
voiddelete_face (Face_handle)删去一个面片
voiddelete_vertex(Vertex_handle)删去一个顶点

杂项函数

返回值类型函数声明及释义
intccw (int i) const 返回(i+1) modulo 3其中 0 ≤ i ≤ 2 0\leq i\leq2 0i2
intcw (int i) const 返回(i+2) modulo 3其中 0 ≤ i ≤ 2 0\leq i\leq2 0i2
boolis_valid ()检查三角数据结构的组合有效性:为每个顶点和每个面调用 is_valid() 成员函数,检查顶点数以及顶点数、面数和边数之间的欧拉关系。
size_typedegree (Vertex_handle v) const 返回三角数据结构中 v 的度数。
voidfile_output (ostream &os, Vertex_handle v=Vertex_handle(), bool skip_first=false)将三角测剖分数据结构写入流 os.
Vertex_handlefile_input (istream &is, bool skip_first=false) 从文件中输入三角剖分数据结构并返回第一个输入顶点的句柄。
istream &operator>> (istream &is, TriangulationDataStructure_2 &tds)从 is 读取组合三角剖分数据结构并将其分配给三角剖分数据结构。
ostream &operator<< (ostream &os, const TriangulationDataStructure_2 &tds) 将 tds 写入流 os。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值