Hello World 之 CGAL
CGAL有神秘的面纱,让我不断想看清其真面目。开始吧!
1 Three Points and One Segment
第一个例子是创建3个点和一条线段,并且在其上进行一些操作。
所有的CGAL头文件都在CGAL目录下。所有的CGAL类和函数都在CGAL的命名空间。类以大写字母开头,常量全大写,全局函数名小写。对象的空间维度由后缀给出。
几何元,如点,在一个kernel中定义。第一个例子中我们选择的kernel采用double精度的浮点数作为笛卡尔空间坐标。
另外,我们有predicate(断言),如位置测试断言,我们有construction(构建),如距离和中点的计算,都是construction。一个predicate的结果是一个离散集,一个construction产生一个值,也可能产生一个新的几何实体。
File Kernel_23/points_and_segment.cpp
如果只从代码上看,我们会发现前两种情况也应当是共线的,但实际的结果是:
not collinear
not collinear
collinear
File Kernel_23/exact.cpp
这里的结果仍然让我们吃惊:
not collinear
collinear
collinear
第一个结果仍然是错的,原因与前面相同,它们仍然是浮点运算。第二个结果不同,它由字符串生成(construct),则精确地代表了字符串所表示的数。第三个结果通过构建(construct)中点得到第三个点,构建操作是精确的,所以结果也是正确的。
在很多情况下,你操作“精确”浮点数据,认为它们是由应用计算得到或由传感器得到的。它们不是象“0.1”这样的字符串,也不是象"1.0/10.0"这样动态( on the fly)生成的,它是一个全精度的浮点数。如果它们只是被传递入某个算法并且没有构建(construct)操作时,你可以使用支持精确断言(predicate)和非精确构建(construct)的kernel。这样的例子包括下一节我们看到的“凸包”算法。它的输出是输入的一个子集,这个算法只进行坐标比较和位置测试。
由于高精度的计算需要消耗比普通计算多的资源,内存、时间等,所以使用时需要考虑。
大部分CGAL包说明它们需要或支持哪种kernel。
2 The Convex Hull of a Sequence of Points
本节所有例子都是凸包算法。输入一个点序列,输出所有凸包边界上的点序列。
下面的例子输入和输出的都是一个坐标数组。
File Convex_hull_2/array_convex_hull_2.cpp
File Convex_hull_2/vector_convex_hull_2.cpp
3 About Kernels and Traits Classes
本节简介traits的内涵和意义.
在上个例子中,如果我们阅读convex_hull_2()的手册时,会发现它及其他2D convex_hull_2()算法都有两个版本。其中一个版本包含了traits参数。
什么原因要我们使用traits呢?泛型编程需要使用抽象元语对算法进行抽象,而在实现中将元语变为实际的类型和算法。那么convex hull算法需要哪些元语(primitive)呢?最简单的"Graham/Andrew Scan"算法过程是:(1)将所有输入的点进行从左到右排序;(2)从左向右顺序加入,逐步形成convex hull。这个过程(ch_graham_andrew())需要的元语包括:
Traits::Point_2
Traits::Less_xy_2
Traits::Left_turn_2
Traits::Equal_2
可以看出,Left_turn_2负责位置测试,Less_xy_2用于点的排序(这些类型需要满足的要求在概论念ConvexHullTraits_2中进行详细说明)。
从泛型概念的要求出发,这些元语需要抽象形成模板,所以下面是新的算法形式:
File Convex_hull_2/convex_hull_yz.cpp
4 Concepts and Models
一个概念(concept)是一个类型的一个需求集(requirment set),它包括一些内嵌的类型,成员函数或一些处理该类型自由函数。
一个概念的模型(model of a concept)是一个用于实现概念所有需求的一个类。
下面有一个函数:
如果你用一个类C来实例化该函数,则C必须提供一个复制构造函数(copy constructor),我们称类C必须是“可复制构造的”(CopyConstructible)。
另一个例子:
这个函数只有在类型T的operator<(..)有定义时才能编译。我们称类C必须是“小于关系可比较的”(LessThanComparable)
关于自由函数的一个例子:CGAL包和Boost Graph库中的HalfedgeListGraph概念。如果一个类G要成为HalfedgeListGraph的一个模型,必须有一个全局函数halfedges(const G&)处理该类。
关于带有traits需求的概念的一个例子是InputIterator。对于一个InputIterator的模型,一个特化的std::iterator_traits类必须存在(或其通用的模板必须可用)。
5 Further Reading
阅读:
"The C++ Standard Library, A Tutorial and Reference" by Nicolai M. Josuttis from Addison-Wesley, or "Generic Programming and the STL" by Matthew H. Austern for the STL and its notion of concepts and models.
Other resources for CGAL are the rest of the tutorials and the user support page at https://www.cgal.org/.
Hello World 之 CGAL的更多相关文章
- QT特供 CGAL配置流程(基于QT5+VS2015)
最近做的QT项目涉及计算几何库,需要用到CGAL,其配置着实麻烦,而且相互关联的软件也存在版本兼容一类的问题,在这里就对其配置流程做一些整理说明,以便后来者能够少些烦恼.(注:以下使用Win10作说明 ...
- 最近在 OS-10.9下配置opencv, cgal, latex, qt, pillow
其实我之前使用的Mac os的版本是10.8的雪豹,可是最近想体验一下Mac os10.9新版本,于是就开始更新Mac os,经过10多个小时的下载和成功安装后,发现之前的配置全乱了,首先是发现lat ...
- 《zw版·Halcon-delphi系列原创教程》cgal与opencv,Halcon
<zw版·Halcon-delphi系列原创教程>cgal与opencv,Halcon opencv作为少有的专业开源图像软件,虽然功能,特别是几何计算方面,不如Halcon,不过因为开源 ...
- CGAL Manual/tutorial_hello_world.html
Hello World Author CGAL Editorial Board 本教程是为知道C++和几何算法的基本知识的CGAL新手准备的.第一节展示了如何特化点和段CGAL类,以及如何应用几何谓词 ...
- CGAL 介绍
CGAL组织 内核 数值健壮 基础库 扩展性 2.4 命名约定 Naming In order to make it easier to remember what kind of entity a ...
- [CGAL]带岛多边形三角化
CGAL带岛多边形三角化,并输出(*.ply)格式的模型 模型输出的关键是节点和索引 #include <CGAL/Triangulation_vertex_base_with_id_2.h&g ...
- CGAL学习:数据类型
CGAL 4.13 - Number Types 1 Introduction(介绍:略) 涉及到的数大致有3种:一是整数,二是有理数,三是浮点数.有理数可以用2个整数表示.精度上可分为任意精度和固定 ...
- 2D Polygons( Poygon) CGAL 4.13 -User Manual
1 Introduction A polygon is a closed chain of edges. Several algorithms are available for polygons. ...
- 2D Convex Hulls and Extreme Points( Convex Hull Algorithms) CGAL 4.13 -User Manual
1 Introduction A subset S⊆R2 is convex if for any two points p and q in the set the line segment wit ...
- Linear and Quadratic Programming Solver ( Arithmetic and Algebra) CGAL 4.13 -User Manual
1 Which Programs can be Solved? This package lets you solve convex quadratic programs of the general ...
随机推荐
- hive基本结构与数据存储
一.Hive简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.还可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自 ...
- 文本操作 $(..).text() $(..).html() $(..).val()最后一种主要用于input
文本操作: $(..).text() # 获取文本内容 $(..).text('<a>1</a>') # 设置文本内容 $(..).html() $(..).html('< ...
- c# 后台调用接口接收传过来的json
public string GetRequestTest(string url) { HttpWebRequest httpWebRequest = (HttpWebRequest)WebReques ...
- 新手C#string类常用函数的学习2018.08.04
ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower ...
- 40. Combination Sum II (Back-Track)
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- ampify shader工具学习一
如何使用lambert Amplify Shader Editor 1.5.3 高级shader编辑工具 2018_5 点击下载
- c++ stringstream的使用
stringstream ss;//一次创建多次使用,需要进行clear()操作清除流状态标记 int i=0; while (i<3) { ss<<"21"; ...
- bug解决思路
1.定位 2.往前看3段:如果有If判断,就重点看为什么会进入到该判断里面
- ps 中添加一张图片
// 测试打开一个文件var fileref = new File ("/E/work/没有图片提交/2014/2014.5.19/G20/部件渲染测试/png/tianji_1-41001 ...
- 矩阵乘法np.dot()及np.multiply()以及*
转载自 https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法 1. 同线性代数中矩阵乘法的定义: np.do ...