CGAL的半边数据结构

1、介绍

        半边数据结构(缩写为 HalfedgeDS,或 HDS 用于模板参数)是一种以边为中心的数据结构,能够维护顶点、边和面的关联信息,例如用于平面地图、多面体或其他可定向的二维表面,这些表面嵌入在任意维度中。每条边被分解为两个具有相反方向的半边。每个半边中存储一个关联面和一个关联顶点。对于每个面和每个顶点,存储一个关联半边。半边数据结构的简化变体可以省略其中一些信息,例如面中的半边指针或面的存储。

CGAL的半边数据结构_第1张图片

        半边数据结构是一种组合数据结构,通过在半边数据结构之上构建的类来添加几何解释。这些类可能比直接使用半边数据结构更方便,因为半边数据结构是一个实现层。

        这里提供的数据结构也被称为FE结构,半边,或双连接边列表(DCEL)[3]。半边数据结构也可以被看作四边数据结构的变体之一。一般来说,四边数据可以表示不可定向的2-流形,但这里的变体仅限于可定向的2-流形。

        由于调整大小对于HalfededDS来说通常是一项昂贵的操作,并且只有在数据结构的定义良好的状态下(没有悬挂句柄)才可能进行,因此在插入超出当前容量的新项之前,必须提前为HalfededDS-显式调用它。每条边由两条方向相反的半边表示。每个半边都可以存储对入射面和入射顶点的引用。对于每个面和每个顶点,都会存储一个入射半边。

2、软件设计

CGAL的半边数据结构_第2张图片

        

        以Polyhedron_3为例,说明了软件设计的三个层的职责。这些项为实际存储的信息提供了空间,即Vertex、Halfedge和Face分别具有成员变量和访问成员函数。Halfedge需要提供对下一个半边和对立半边的引用。它们可以选择提供对前一个半边、入射顶点和入射面的引用。顶点和面可以是空的。它们可以选择提供对入射半边的引用。提到的选项在半边数据结构和多面体中都受支持,例如,欧拉操作会更新可选引用(如果存在的话)。此外,项目类可以扩展为任意属性和成员函数,这些属性和成员函数将通过继承提升为多面体实际使用的类。

        顶点、半边和面作为Items类的局部类型传递给半边数据结构和多面体。提供了满足要求强制性部分的顶点、半边和面的实现。用户可以将它们用作扩展的基类。还提供了更丰富的实现作为默认值;对于多面体,它们提供所有可选的入射角,顶点类型中的三维点和面类型中的平面方程。

        Halfpedge的数据结构概念HalfpedgeDS,负责项目的存储组织。目前,提供了在内部使用双向列表或向量的实现。HalfdedgeDS定义了属于这些项的句柄和迭代器。这些类型被提升为项目本身的声明,并用于提供对偶发事件项目的引用。这种类型的提升是通过项目类型的模板参数Refs来完成的。half-edge数据结构提供了插入和删除项、遍历所有项的成员函数,并提供了对这些项的访问权限。

CGAL的半边数据结构_第3张图片

        HalfdedgeDS概念有两种不同的模型,HalfdededgeDS_list和Halfdedge DS_vector,可能还会有更多。因此,我们保持了它们的接口较小,并将通用功能分解为单独的帮助程序类HalfdedgeDS_decorator、HalfdededgeDS_const_decorator和HalfdedgeDS_items_decorator,它们在上图中没有显示,但会放在HalfdedgesDS的一侧,因为它们扩展了接口,但没有隐藏它。这些辅助类包含有助于在下一层(例如多面体)中实现操作的操作。例如,它们添加了Euler运算和局部运算,从这些运算可以构建进一步的Euler运算,例如将边插入顶点处的边环中。此外,辅助类包含自适应功能。例如,如果没有为半边缘提供HalfdedgeDSHalfdedge::prev()成员函数,则辅助类的HalfdededgeDS_items_decorator::find_prev()成员功能将沿面正向搜索上一个半边缘。但是,如果提供了HalfdedgeDSHalfdedge::prev()成员函数,HalfdededgeDS_items_decorator::find_prev()成员功能只需调用它。

        作为三维的一个例子,Polyhedron_3增加了几何解释,提供了一个易于使用的高级功能界面,并统一了对下面提供的灵活性的访问。它把face重新命名为facet,这在三维表面中更为常见。该界面旨在保护内部表示的完整性,存储在项目中的句柄不再能被用户直接写入。多面体增加了方便高效的循环器,参见循环器,用于访问围绕顶点或面的循环序列的边缘。为了实现这一点,Polyhedron_3从Items中提供的那些中派生出新的顶点、半边和面。这些新项目是HalfedgeDS中实际使用的项目,这给了我们在这个设计中的一致的类型结构,特别是与我们以前的设计相比。

        HalfdedgeDSItems概念封装了半边缘数据结构的三种项类型——顶点、半边缘和面。HalfdedgeDSItems包含三个成员类模板,分别命名为Vertex_wrapper、Halfdededge_wrapper和Face_wrapper,每个模板都有两个模板参数Refs和Traits。Refs需要一个实例化的半边缘数据结构HalfpedgeDS作为参数,Traits是一个几何特征类,由使用半边缘数据架构作为内部表示的类提供。半边缘数据结构本身不使用特征。这三个成员类模板分别提供了名为“顶点”、“半边缘”和“面”的局部类型。

        在CGAL库中,Vertex_wrapper是一个用于包装多面体顶点的类。它提供了一种方便的方式来访问和操作多面体顶点的信息。

3、范例

create_loop();是首尾相连

范例1、创建循环,并检查有效性,注意指针指向未知的地方。

范例2、和上一个范例相同,只有HDS的定义存在些许差别,使用最小的半边结构。

范例3、和上一个范例相同,只有HDS的定义存在些许差别,使用矢量进行替代。

范例4、自定义半边数据结构中的面

范例5、自定义半边结构(非常复杂)

范例6、使用半边指针对这个数据结构进行遍历

范例7、使用顶点指针对这个数据结构进行遍历。

CGAL的半边数据结构_第4张图片

OCGAL 5.6 - Halfedge Data Structures: User Manual

你可能感兴趣的:(CGAL,数据结构)