CGAL介绍

标签:
cgal框架 |
分类: CGAL |
正确性、健壮性、灵活性、易于使用、有效性
1.2 总体设计
设计目标决定了采用C++的模版技术来构造泛型编程范式。3个主要的层次:算法和数据结构层、核心层、算术和代数运算层。
http://www.cgal.org/Manual/4.2/doc_html/Developers_manual/Developers_manual/fig/generic_cgal.gif
为了避免长参数列表,将所有的参数类型都集中到一个单独的类,叫做traits类。
通过泛型技术,算法和数据结构成为具体的对象和操作的抽象。
CGAL定义了一个几何内核kernel,包含了大量的集合对象,例如:点、线、线段、圆以及在它们之上的操作。此外还有两个特殊的叫circular和spherical的核,用于那些基于圆和球的对象。
参考文献:"Using generic programming for designing a data structure for polyhedral surfaces"
http://s10/mw690/003tGfdagy6HFDrSPKV09&690
Halfedge_data_structure作为容器类管理Vertex、Halfedge、Facet三项及其之间的拓扑关系。
Topological_map管理Facet上的holes,也为Facet计算内部和外部边界。
Polyhedron类在Halfedge_data_structure上增加了几何操作。(因为半边数据结构可能有其他用途,并未严格按多边形表面的定义来约束)
Halfedge_data_structure和Vertex、Halfedge、Facet被称为概念(concept),有三种不同的Halfedge_data_structure模型,一种采用STL 里的vector,另2中基于list来表示。
Halfedge_data_structure为这些基本item存储组织方式负责,采用双向链表或者STL的vector方式实现。Halfedge_data_structure定义了属于这些item的句柄handle和迭代器iterator.
Polyhedron提供了易于使用的高级函数接口,接口被设计成能保护内部表达的完整性,句柄handle不在是不定的。Polyhedron中加入了方便有效的循环器circulator。
**************************************************************************
CGAL中通过在真实的几何内核kenel和数据结构、算法之间使用traits类,允许我们容易为其他的核提供适配器adaptor.
一个使用基于缺省的双精度的笛卡尔内核的多面体Polyhedron的声明如下:
typedef CGAL::Simple_cartesian Kernel;
typedef CGAL::Polyhedron_default_traits_3 Traits;
typedef CGAL::Polyhedron_3 Polyhedron;
**************************************************************************
CGAL::Polyhedron_incremental_builder_3< HDS >
Class
支持增量构造多面体表面,方便从Object File Format (OFF)\OpenInventor\VRML格式的文件构建。
它需要访问多面体表面的半边数据结构中的类型HDS。
**************************************************************************
CGAL中的定义对于顶点,边和面元素进行了封装,将他们放在同一个不带模板参数的类里面,类似下面代码模仿的HalfedgeDS_iems,从而将他们集中到一起并且最外层去掉模板参数,里面通过wrapper将他们的定义包装。用户可以定义不同的顶点类,只要在传给HalfedgeDS的HalfedgeItesms参数的类中typedef 自己定义的顶点类为Vertex即可。
例:
#include
#include
#include
using std::list;
using std::string;
using std::cout;
using std::endl;
template
struct Vertex {
};
template
struct Halfedge {
};
struct HalfedgeDS_iems {
};
template < typename HalfedgeDSItems>
struct HalfedgeDS {