CGAL介绍
2024-03-06 14:44:51 1 举报
AI智能生成
CGAL,一个三维mesh处理的数学库,虽然功能强大,但是其由于模板特性,阅读起来很是晦涩;尤其涉及到里面的很多内核概念,以及库的架构,给要使用这个库的新人造成了很大困扰,以下是我开发过程中的总结,希望能帮助新手小白快速入门这个库;(内容整理不容易)
作者其他创作
大纲/内容
算法和数据结构层(主要功能模块)
三角剖分
voronoi图
多边形
多面体
网格生成
几何处理
凸壳算法
...
内核层
几何对象
点
线段
直线
圆
案例
Point_2 < Kernel >:表示二维空间中的一个点,它有两个坐标值。
Line_2 < Kernel >:表示二维空间中的一条直线,它有三个系数值。
Ray_2 < Kernel >:表示二维空间中的一条射线,它有一个起点和一个方向向量。
Segment_2 < Kernel >:表示二维空间中的一条线段,它有两个端点。
Triangle_2 < Kernel >:表示二维空间中的一个三角形,它有三个顶点。
Iso_rectangle_2 < Kernel >:表示二维空间中的一个矩形,它有两个对角顶点。
Line_2 < Kernel >:表示二维空间中的一条直线,它有三个系数值。
Ray_2 < Kernel >:表示二维空间中的一条射线,它有一个起点和一个方向向量。
Segment_2 < Kernel >:表示二维空间中的一条线段,它有两个端点。
Triangle_2 < Kernel >:表示二维空间中的一个三角形,它有三个顶点。
Iso_rectangle_2 < Kernel >:表示二维空间中的一个矩形,它有两个对角顶点。
也可以这样写 kernel::Point_2 / kernel::Line_2 / Kernel::Line_3
操作概念(比较抽象/有不同的具体实现)
smiple_cartesian
适应于不需要精确断言或构造,快速渲染或者可视化
cartesian
Homogeneous
simple_hoogeneous
使用条件
如果要精确结果:使用cartesian/homogeneous
快速渲染或者近似求解,使用smiple_XXX开头的字样
各种Kernel
**Kernel:**是最终概念具体实现的地方;
代数层
为CGAL中的集合运算提供代数支持,如多项式方程求解,根的比较
由一组代数结构和操作概念组成,有理数,实数,代数
支持库和接口层
提供辅助功能
几何对象生成器,空间排序,矩阵搜索,线性和二次规划求解等
第三方软件的集成
比如和Qt,Bootst等库的接口,方便进行可视化,图形处理
用法上疑惑
CGAL::Exact_predicates_inexact_constructions_kernel Kernel: 这个东西是什么?怎么用?什么时候用?
CGAL::Exact_predicates_inexact_constructions_kernel是一个预定义的内核,它定义了一些基本的几何类型和操作,比如点、向量、线段、圆等。内核是CGAL库的核心组件,它决定了几何对象的表示方式和准确性2。
CGAL::Exact_predicates_inexact_constructions_kernel的特点是它使用笛卡尔坐标系来表示几何对象,它支持从双精度浮点数构造点,它提供了精确的几何判断,但是不精确的几何构造13。这意味着它可以保证判断两个几何对象之间的关系(比如相交、包含、平行等)时不会出错,但是在构造新的几何对象(比如求交点、中点、外接圆等)时可能会有舍入误差2。
CGAL::Exact_predicates_inexact_constructions_kernel的优点是它比其他内核更快,因为它不需要进行任何精确运算2。它适用于大多数计算几何问题,只要不需要对构造结果进行进一步的判断或操作4
CGAL::Exact_predicates_inexact_constructions_kernel的特点是它使用笛卡尔坐标系来表示几何对象,它支持从双精度浮点数构造点,它提供了精确的几何判断,但是不精确的几何构造13。这意味着它可以保证判断两个几何对象之间的关系(比如相交、包含、平行等)时不会出错,但是在构造新的几何对象(比如求交点、中点、外接圆等)时可能会有舍入误差2。
CGAL::Exact_predicates_inexact_constructions_kernel的优点是它比其他内核更快,因为它不需要进行任何精确运算2。它适用于大多数计算几何问题,只要不需要对构造结果进行进一步的判断或操作4
总结: 预定义内核,不准确构造,判断几何对象关系可以,但是求交会有误差(不适合求交等计算)
解释上面用到的单词
Exact
确切的
predicates
以....为断言,判断
inexact
不精确的
constructions
构造
Kernel
内核
CGAL::Exact_predicates_exact_constructions_kernel
这个内核类也使用笛卡尔坐标系来表示几何对象,但是它提供了精确的几何判断和精确的几何构造
1.这意味着它可以保证判断和构造的结果都没有舍入误差
2.这个内核类比CGAL::Exact_predicates_inexact_constructions_kernel更慢,但是更可靠。
1.这意味着它可以保证判断和构造的结果都没有舍入误差
2.这个内核类比CGAL::Exact_predicates_inexact_constructions_kernel更慢,但是更可靠。
CGAL::Simple_cartesian<FT>
这个内核类也使用笛卡尔坐标系来表示几何对象,但是它不提供任何几何判断或构造。
这意味着它只能用于存储和访问几何对象的坐标,而不能用于进行任何几何运算。
这个内核类比CGAL::Exact_predicates_inexact_constructions_kernel更简单,但是更有限
这意味着它只能用于存储和访问几何对象的坐标,而不能用于进行任何几何运算。
这个内核类比CGAL::Exact_predicates_inexact_constructions_kernel更简单,但是更有限
CGAL::Homogeneous<RT>
这个内核类使用齐次坐标系来表示几何对象,它提供了精确的几何判断和构造。这意味着它可以保证判断和构造的结果都没有舍入误差。这个内核类比CGAL::Exact_predicates_inexact_constructions_kernel更复杂,但是更通用
理解这里面这个通用问题:
通用的意思是这个内核类可以用于更多的计算几何问题,比如那些需要精确的几何构造或者涉及无穷远点的问题。例如,如果你想计算两条平行线在透视空间中的交点,或者你想计算一个多边形的面积,那么使用CGAL::Homogeneous<RT>内核类会比CGAL::Exact_predicates_inexact_constructions_kernel内核类更合适,因为它可以避免舍入误差和无穷大的表示问题。齐次坐标系是一种使用N+1维来表示N维空间的方法,它可以处理无穷远点和透视变换等问题12
Surface_mesh 和 polyhedron 区别
共同点:
都可以表达 多面体的半边结构
差异:
1.surface_mesh 基于索引,polyhedron基于指针 : 意味着: 索引占用空间少, 指针访问速度快
2.surface_mesh,运行时动态的添加或者删除属性到顶点,半边,面, 而后者在编译时静态得定义属性
注意; surface_mesh,删除元素,只是标记为已删除,并不会真正释放内存空间,需要调用会收函数清理空间
而polyhedron删除元素立刻释放空间, 意味着: surface_mesh 可以更容易撤销删除操作!!!, polyhedron更加节省空间
而polyhedron删除元素立刻释放空间, 意味着: surface_mesh 可以更容易撤销删除操作!!!, polyhedron更加节省空间
halfedgeDs
类似得其他结构:
Triangulation_3:用于表示三维空间中的三角剖分的数据结构,它可以是Delaunay三角剖分、约束Delaunay三角剖分或正则三角剖分。Triangulation_3可以用于实现各种几何算法,如网格生成、表面重建、空间查询等1。
Surface_mesh_complex_2_in_triangulation_3:用于表示嵌入在Triangulation_3中的二维复合曲面的数据结构,它可以用于实现表面网格生成、表面网格优化、表面网格细化等算法2。
Linear_cell_complex:用于表示任意维度的线性单纯复形的数据结构,它可以用于实现拓扑操作、几何变换、拓扑分析等算法3。
Surface_mesh_complex_2_in_triangulation_3:用于表示嵌入在Triangulation_3中的二维复合曲面的数据结构,它可以用于实现表面网格生成、表面网格优化、表面网格细化等算法2。
Linear_cell_complex:用于表示任意维度的线性单纯复形的数据结构,它可以用于实现拓扑操作、几何变换、拓扑分析等算法3。
使用技巧
点一:里面循环遍历 vertexDescription = vertexIndex = *Iterator 迭代器; 都是要点的下标索引!
点二: cgal的模型大多是是半边结构,流行边,没有奇异点,奇异边这种.要求高
半边
处理多边形面
获取一个顶点,可以查看其点围绕的边构成的polygon
通过半边获取面的入射顶点(备注):
获取面上的点
Vertex_around_face_circulator
0 条评论
下一页