????????CGAL提供了几种处理点集的算法,从形状检测到通过标准点集处理工具进行的表面重建。
????????虽然这些算法不强制使用特定的数据结构,但该软件包提供了一个3D点集结构,使用户更容易处理附加属性,如法向量、颜色、标签,并在其上调用CGAL算法。
????????CGAL::Point_set_3<Point,Vector> 是一个基于矢量的数据结构,其中包含点的坐标的默认属性(名为point)。
????????用户需要的任何属性都可以在运行时轻松添加、修改和删除。属性由唯一名称和类型标识。提供了便利的方法来处理法向量(名为normal的属性),这是点集上非常常见的属性。
????????为了优化内存分配和释放,每个点都与一个索引相关联。删除一个点只是将索引标记为已删除。在内部,这避免了在每次删除时修改属性向量,并允许插入新点以重用标记为已删除的点的索引。特别地,这意味着在某些删除操作完成后插入的点可能具有非默认初始化的属性。如果用户需要有效地释放内存,可以使用Point_set_3::garbage_collect()从内存中实际删除标记为已删除的元素。
????????数据结构设计为易于使用,尽管在使用属性时可能存在复杂性。提供了几种方便的方法来处理点和法线,而不必直接处理特性。
????????点集中的每个信息都是一个属性。原始点集仅具有点特性。正如我们在前面的例子中看到的,用户可以很容易地添加一个普通属性。但这种机制可以推广到任何类型的属性。
????????大多数CGAL的算法让用户自由选择输入数据结构:然后通过范围和属性映射访问点和属性。CGAL::Point_set_3类是一个提供属性映射的范围:应用CGAL算法很简单。
????????由于点集处理算法使用命名参数来处理属性映射,因此提供了一种方法CGAL::Point_set_3::parameters():它返回一个命名参数对象,该对象包含正确的点和法线映射,以便在点集对象中读写。
????????此外,包Point Set Processing的所有输入/输出函数都被重载,因此用户只需将 Point_set_3 对象作为参数调用它们即可(请参见输入/输出)。
????????以下示例显示了如何使用点集对象应用CGAL库中的一些算法:
????????生成围绕球体的点集
????????使用CGAL::jet_estimate_normals()估计法线
????????用CGAL::grid_simplify_point_set()简化点集;?
???????使用CGAL::shape_detection::Efficient_RANSAC检测球体形状
????????使用CGAL的函数读取文件需要稍微不同的行为,因为在将点插入点集中之前,会在内部定义该点的属性(这在CGAL::point_set_3中是不可能的)。尽管使用上一小节中提供的重载应该涵盖大多数用途,但我们记录了内部使用的特定后插入器和属性映射:
????????CGAL::Point_set_3::index_back_inserter()用作创建新点的输出迭代器。
????????CGAL::Point_set_3::Point_push_map()是用于设置点坐标的特性映射。如果不是首先创建的,它将首先在结构中插入创建的点(例如通过index_back_inserter())。
????????CGAL::Point_set_3::normal_push_map()的工作原理类似,但适用于法线向量。
????????这种推送属性映射也可用于其他用户定义的属性(请参见CGAL::Point_set_3::push_property_map())。
?
????????可以通过调用CGAL::draw<PS>()函数来可视化3D点集