CGAL的使用

2023-10-26

1 C++类的知识

因为CGAL是用C++实现的,所以需要先了解一下C++编程。C++是面向对象的编程,这也是C++对C语言改进的最重要的部分。C++也被叫做是"带类的 C"。简单讲一下类的构成,成员函数以及对象的定义和使用。

1.1 C++类的构成

首先从C的结构体说起。C中的结构体我想大家已经熟悉了,不熟悉的朋友可以先了解一下,这将对你认识“类”有很好的帮助。C中的结构体存在缺点:1.main 函数中的任意赋值语句都可以访问结构体中的成员,但在实际应用中我们想保护自己的私密数据不被访问,因此C语言中的结构体的数据是不安全的;2.结构体中的数据和对该数据的操作是分离的,并不是一个被封装起来的整体,因此使程序难以重用,影响了软件生产效率。于是C++中引入了类的概念。

C++中类的一般格式为:

   class Kid
   {
      private:
      int age;    //私有成员
      char *name;
      char *sex;
      public:      //公有成员
      void setKid(int age,char *name,char *sex);
      void showKid();
   };

C++中规定如果没有对类的成员加私有private,保护protected,公有public,则默认为私有的。而对于 C++的结构体来说,成员可以是私有的,保护的或公有的,但默认为公有的;还有要注意的是不能在类的声明中给数据成员赋值。

一般情况下,一个类的数据成员应该声明为私有的,成员函数声明为共有的。这样,内部的数据隐藏在类中,在类的外部无法访问直接访问,使数据得到有效的保护。而公有的成员函数就成为一种与类外部沟通的接口。

1.2 C++中的成员函数

1) 普通的成员函数。
要注意几点:1.类名和函数名之间应加上作用域运算符::,用于声明这个成员函数是属于哪一个类的,如果在函数名前没有类名,或既无类名又无作用域运算符::,那么这个函数不属于任何类,不是成员函数,而是普通函数;2.在类的声明中,成员函数原型的参数表中可以不说明参数的名字,而只说明它的类型,但在类外定义时必须既要说明参数类型又要说明参数名;
2) 内联成员函数,它又分显式声明和隐式声明。

1.3 C++中的成员函数

类与对象的关系可以用数据类型int和整形变量i之间的关系来类比。int类型和类类型代表一种抽象的概念,而整形变量和类的对象代表具体的东西。C++把类的变量称为类的对象,对象也被称为类的实例;类的对象可以是: class Kid{...}kid1,kid2;也可以是声明了类后,使用时在定义对象: Kid kid1,kid2;(声明一个类后,它并不接受和存储具体的值,只作为生成具体对象的一种样板,只有定义了对象后,系统才为对象分配存储空间,以存放对象中的成员);

对对象中的成员的访问可以是:
1) 对象名.数据成员名/对象名.成员函数名(参数),比如

kid1.setKid(10,"rookie_j","男");

2) 指针访问对象中成员,比如:

class Kid{public: int age;}; 
Kid kid,*ptr; 
ptr=&kid;
cout << ptr->age //cout<<(*ptr).age;

3) 可以通过引用来访问对象中的成员

class Kid{public: int age;};
Kid kid;
Kid &ptr=kid;
cout << ptr.age   //cout<<kid.age;

因为接下来要讲解的运用CGAL库编写凸包的程序,其程序运用以上的 C++的知识就可以理解了,所以只讲解以上的 C++ 的知识,具体想了解 C++的话,推荐(注意了解某种语言,不在于你看了多少书,而是去尝试编写)

1.《C++ Primer中文版》(第4版)
    【原书名】 C++ Primer (4th Edition)
    【原出版社】 Addison Wesley/Pearson
    【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo
    【译者】 李师贤
    【丛书名】 图灵计算机科学丛书
    【出版社】人民邮电出版社
2.《C++ Primer Plus》(第四版)中文版
    【原书名】 C++ Primer Plus,Fourth Edition
    【原出版社】 Sams
    【作者】 (美)Stephen Prata
    【译者】 孙建春 韦强
    【丛书名】 Primer Plus 系列
    【出版社】 人民邮电出版社

2 CGAL库的应用

2.1 CGAL 中的 Kernel 和眼花缭乱的 typedef

看CGAL中演化缭乱的Kernel对我这个C++入门级的人来说是件痛苦的事。倘若有时间,我会认真去看看模板类,类模板什么的再去好好理解这些东西,但是我想大部分人在学习新的东西的时候是没有兴趣去看那么的多参考书。所以摸着石头过河时最好最有效的方法。以下说说这Kernel是个什么东西,为什么要有那么多的typedef

CGAL的开发人员力图让这个程序包有较强的扩展性,要有扩展性,同时又要有一定的规则层次。这个层次的底层是代数结构,其上谈number type,再往上就是基本几何对象(线,面,点,射线,线段)和定义在基本几何对象上的基本算法,在往上就是各种复杂的几何算法(包围盒,搜索,网格化等),如下图所示。
CGAL层次图
<img src="htt://cgal_use.com/1.png" width="400" height="100">

所谓的Kernel就是Layer2的内容。CGAL将Layer2按照基本几何对象的表达方式(用欧式坐标表达还是其次坐标表达)进一步分成CartesianHomogeneous两种。简单的说,我们用Cartesian开始编程,以后的对象操作什么的都是用x , y , z三个坐标去表示点,线,面。

因为各个layer的东西在CGAL里都是以类模板的形式定义。CGAL的一开始,会有一大堆typedef,其实就是给这些类模板起一个简单而又好记的名字。看一例:

   typedef CGAL:: Exact_predicates_exact_constructions_kernel K;
   typedef K::Ray_3 Ray;
   typedef K::Line_3 Line;
   typedef K::Point_3 Point;
   typedef K::Triangle_3 Triangle;
   typedef std::list<Triangle>::iterator Iterator;
   typedef CGAL::AABB_triangle_primitive<K,Iterator> Primitive;

CGAL给出了一些预定义的东西,也就是把上面那个不断typedef的最初一部分给隐藏掉:

   Exact_predicates_exact_constructions_kernel;
   Exact_predicates_exact_constructions_kernel_with_sqrt;
   Exact_predicates_inexact_constructions_kernel;

这些预定义的东西默认使用Cartesian,数据类型支持double,还包括能实现精确的几何判断(exact predicate ),原来的代码可以写成:

   typedef CGAL:: Cartesian<double> K;// 使用Cartesian坐标描述几何体,坐标的数值时double型,以后用到 ray , line等几何体的时候都按照Cartesian方式给出double型坐标。
   typedef K::Ray_3 Ray;
   typedef K::Line_3 Line;
   typedef K::Point_3 Point;
   typedef K::Triangle_3 Triangle;
   typedef std::list<Triangle>::iterator Iterator;
   typedef CGAL::AABB_triangle_primitive<K,Iterator> Primitive;//这句话表示使用高级计算几何算法AABB时,所有的几何对象都是Cartesian表示的,坐标的数值都是double。

2.2 CGAL中某种算法的运用流程

点击http://doc.cgal.org/latest/Manual/packages.html| 66c998fe1f511ede5c7483b24fcc88ca4 |进入CGAL手册,出现各种算法库Arithmetic and AlgebraCombinatorial AlgorithmsGeometry KernelsPolygons、Arrangements等等。
假如我们想找有关3d凸包的算法,则找到如下图所示的算法,
3D凸包手册

点击reference manual,就会看到该算法库中的ConceptsTraits ClassesConvex Hull FunctionsConvexity Checking Function,如下图:
图片描述

点击convex_hull_3函数,就会看见该函数的使用规则和实例,如下图
图片描述

每个算法库中都会带有示例程序,点击左侧列表中example->convex_hull_3/quickhull_3.cpp,就会看到如下示例程序:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CGAL的使用 的相关文章

  • matlab中的排列函数是如何工作的

    这是一个有点愚蠢的问题 但我似乎无法弄清楚排列在 matlab 中是如何工作的 以文档为例 A 1 2 3 4 permute A 2 1 ans 1 3 2 4 到底是怎么回事 这如何告诉 matlab 3 和 2 需要交换 哇 这是我迄
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 如何在 MATLAB 中绘制 3D 曲面图?

    我有一个像这样的数据集 0 1 0 2 0 3 0 4 1 10 11 12 13 2 11 12 13 14 3 12 13 14 15 4 13 14 15 16 我想在 matlab 中绘制 3D 曲面图 使列标题位于 y 轴 行标题
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • MATLAB 中的霍夫变换

    有谁知道如何使用霍夫变换来检测二值图像中最强的线 A zeros 7 7 A 6 10 18 24 36 38 41 1 使用 rho theta 格式 其中 theta 以 45 为步长 从 45 到 90 以及如何在 MATLAB 中显
  • “Desort”向量(撤消排序)

    在Matlab中 sort返回排序后的向量和索引向量 显示哪个向量元素已移动到以下位置 v ix sort u Here v是一个包含所有元素的向量u 但已排序 ix是一个向量 显示每个元素的原始位置v in u 使用 Matlab 的语法
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • Matlab 的 imresize 函数中用于插值的算法是什么?

    我正在使用 Matlab Octaveimresize 对给定的二维数组重新采样的函数 我想了解如何使用特定的插值算法imresize works 我在Windows上使用八度 e g A 1 2 3 4 是一个二维数组 然后我使用命令 b
  • 检测数据集中线性行为的算法

    我已经发布了一个关于对数据集的一部分进行多项式拟合的算法 https stackoverflow com q 17595932 2320757前一段时间收到一些建议去做我想做的事 但我现在面临另一个问题 我尝试应用答案中建议的想法 我的目标
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • MATLAB:在不使用循环的情况下提取矩阵的多个部分

    我有一个巨大的 2D 矩阵 我想从中提取 15 个不同的 100x100 部分 我有两个向量 x 和 y 其中保存了零件的左上角索引 我用过这样的东西 result cam1 x 1 end x 1 end 99 y 1 end y 1 e
  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 防止Matlab舍入输出?

    我运行一个简单的脚本来估计函数的根 一切都很好 算法的每次迭代都会打印出当前的 x 和 f x 但是当脚本完成并将 x 的最终估计设置为函数的输出时 该值将被返回并四舍五入到小数点后 3 位 while k lt maxit k k 1 d
  • 一次设置多个字段/向单元结构添加新字段

    我有一个 1xn 结构 该结构包含一些带有数字单元格的字段 并非每个结构都具有相同的字段 所以我想将缺少的字段添加到结构中 但我没明白 Mimimal example I have same cells imported from csv
  • 旋转情节?

    我已经在 Matlab 中获得了正弦曲线的 x y 图 我希望将该图逆时针旋转 90 度 我该怎么做呢 在绘制的图中 单击 视图 gt 相机工具栏 使用滚动相机图标 这应该允许您旋转绘图 编辑 您还可以使用 camroll 函数以编程方式执
  • Matlab 中“end”的语义是什么?

    常见的是使用end关键字作为在 Matlab 中访问或扩展数组的快捷方式 如 gt gt x 1 2 3 gt gt x 1 end 1 ans 1 2 gt gt x end 1 4 x 1 2 3 4 然而 我惊讶地发现以下也有效 gt

随机推荐