CGAL的使用

2023-10-27

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的使用 的相关文章

  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 在Matlab中对字符进行分组并形成矩阵

    我有 26 个字符 A 到 Z 我将 4 个字符组合在一起 并用空格分隔以下 4 个字符 如下所示 abcd efgh ijkl mnop qrst uvwx yz 我的Matlab编码如下 str abcdefghijklmnopqrst
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • matlab中更快的插值方法

    我正在使用 interp1 来插值一些数据 temp 4 30 4 rand 365 10 depth 1 10 dz 0 5 define new depth interval bthD min depth dz max depth ne

随机推荐

  • 数学甜点004

    数学是一门及其高深又变幻莫测的学科 且其根本就是问题的解决 因此是不可能也没有必要去寻找一种能够解决所有问题的通解的 坦白说 研究数学的最大乐趣就是在于发现从来没有人走过的新道路 即一种不同于常规的具有跳跃性 构造性的解法 换句话说 无论是
  • 时序预测

    时序预测 MATLAB实现AR时间序列预测 目录 时序预测 MATLAB实现AR时间序列预测 基本介绍 程序设计 学习总结 参考资料 基本介绍 如果某个时间序列的任意数值可以表示自回归方程 那么该时间序列服从p阶的自回归过程 可以表示为AR
  • 你需要知道面试中的10个JavaScript概念

    翻译原文出处 10 JavaScript concepts you need to know for interviews 之前不是闹得沸沸扬扬的大漠穷秋文章 为什么只会Vue的都是前端小白 甚至大多数回头看了 也就会jQuery和Vue这
  • AI绘画

    今天用Midjourney生成了质量极高的美少女武士后续会作为固定栏目来分享美图接下来请欣赏作品 提示词分享 1 an asian girl dressed in samurai style in the style of anime ae
  • 多维时序

    多维时序 MATLAB实现Attention LSTM 注意力机制长短期记忆神经网络 多输入单输出 目录 多维时序 MATLAB实现Attention LSTM 注意力机制长短期记忆神经网络 多输入单输出 基本介绍 模型背景 LSTM模型
  • error C2041: illegal digit ‘9‘ for base ‘8‘

    错误日志 文本 八进制数值超过范围 1 gt E CProject test12 Source c 5 10 error C2041 illegal digit 8 for base 8 十六进制数值超过范围 1 gt E CProject
  • 【每日一题】ABC194E-Mex Min

    题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a 求所有长度为 m m
  • 【华为OD统一考试B卷

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雁发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • Spring概述 ——跟我学Spring3

    1 1 1 Spring是什么 Spring是一个开源的轻量级Java SE Java 标准版本 Java EE Java 企业版本 开发应用框架 其目的是用于简化企业级应用程序开发 应用程序是由一组相互协作的对象组成 而在传统应用程序开发
  • 打印机"启用双向支持"的意思

    在打印机的属性选项里面 有一项 启用双向支持 的选项 但是具体有什么作用 一直都不明白 今天特意查了一些资料 启用双向支持 简单来说就是来回打印 打印头从左向右走动时能打印 从右向左回来时不能打印 如果不启用 仅仅是从左向右走动时打印 重庆
  • Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs

    问题描述 当SoapUI访问一个webservice时 对于某些webserive服务 如果webserive的输入参数要求是xml格式 如果xml格式输入不正确 会报 Unmarshalling Error Illegal process
  • 工行数据中心高级经理 李雁南:接口冒烟测试方法

    原文出自 听云技术博客 http blog tingyun com web a 今年遇到了几个问题 与接口的功能和性能相关 恰巧最近公司也在组织以冒烟测试为主题的活动 于是乎突发奇想 寻思着能否将接口测试与冒烟测试结合起来 发掘一些新的接口
  • ICLR 2023

    PaperWeekly 原创 作者 叶振辉 单位 浙江大学博士生 研究方向 语音合成 说话人视频合成 语音驱动的说话人视频合成 Audio driven Talking Face Generation 是虚拟人领域的一个热门话题 它旨在根据
  • linux系统配置文件

    1 etc sysconfig i18n 语言配置文件 2 etc sysconfig network scripts ifcfg eth0 eth0配置文件 3 boot grub grub conf grup配置文件 或 boot gr
  • 【第04例】IPD进阶

    目录 前言 专栏目录 内容详解 IPD 相关专栏推荐 华为流程体系 CSDN学院相关内容
  • jdk8

    文章目录 1 场景再现 2 Supplier
  • 前端开发之走进Vue.js

    Vue js作为目前最热门最具前景的前端框架之一 其提供了一种帮助我们快速构建并开发前端项目的新的思维模式 本文旨在帮助大家认识Vue js 了解Vue js的开发流程 并进一步理解如何通过Vue js来构建一个中大型的前端项目 同时做好相
  • (转)JAVA常见异常

    0 需要标识符 a 不在函数内 1 非法表达式开始 b 可能 丢失括号 2 no data found a 可能 setInt 1 100 中 没有100这个值 3 找不到符号 a 可能 没导入包 4 指定了无效URL a 可能 数据库名或
  • pyqt_点击button("添加")弹出新的页面

    目标 通过点击主窗口中的button弹出另一个窗口页面 首先需要注意的是 两个窗口不能是同一类型 否则会崩溃 并保存为名称不同的ui文件 并使用UIC工具转成 py文件 因此在目前文件夹中既有mainwindow又有dialog窗体形式的界
  • CGAL的使用

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