使用浮点数进行几何运算,由于数值精度的问题,可能会出现意想不到的结果。
#include <iostream>
#include <CGAL/Simple_cartesian.h>
using namespace std;
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
int main()
Point_2 p(0, 0.3), q(1, 0.6), r(2, 0.9);
cout << (CGAL::collinear(p, q, r) ? "共线\n" : "不共线\n");
Point_2 p(0, 1.0 / 3.0), q(1, 2.0 / 3.0), r(2, 1);
cout << (CGAL::collinear(p, q, r) ? "共线\n" : "不共线\n");
Point_2 p(0, 0), q(1, 1), r(2, 2);
cout << (CGAL::collinear(p, q, r) ? "共线\n" : "不共线\n");
return 0;
输出结果:
通过观察三组点的坐标,我们知道每组点均为共线关系。但运行结果却只输出一组共线。
这是因为这些分数不能表示为双精度数,共线测试将在内部计算3x3矩阵的行列式,该行列式接近零但不等于零,因此前两组点不共线。
接近共线但为左转关系的点也可能发生类似情况,由于行列式计算过程中的舍入误差,可能会误判为共线或者右转。
Triangulation_2 是CGAL中描述二维三角形剖分的一个模板类。实例化时, 它的第一个模板参数要传入一个几何核心类, 第二个模板参数是一个三角剖分的数据结构类(这个参数有一个默认的值)。这个模板类定义了三角剖分的基本用户接口, 它也是其它三角剖分类(如Delaunay_triangulation_2、Regular_triangulation_2)的基类。
因此它是基于CGAL进
进入CGAL的世界由四个小的主题组成:定义点和线段,以及对他们的简单操作,(这里要有一个重要的认识,就是计算机中的浮点数的使用会导致精度问题,这个也是计算机图形学的一个重要的问题);使用一个典型的CGAL函数,计算二维的凸包;第三部分介绍了一个特征(traits)类;第四部分定义了concept以及model的概念。
1.顶点和线段
#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_
本文是提供给了解c++和几何算法基础知识的CGAL新手的入门教程。第一部分展示了如何定义点和段类,以及如何在它们上应用几何谓词。本节进一步提醒大家,在使用浮点数作为坐标时,会出现严重的问题。第二部分展示了一个计算2D凸包的CGAL函数。第三部分展示了Traits类的含义,第四部分解释了概念和模型的概念。...
AABB Tree简介
「AABB Tree」AABB树组件提供了静态数据结构和算法,以支持对有限的3D对象集执行相交和距离查询。可以查询存储在数据结构中的一组几何对象,以进行相交检测、相交计算和距离计算。
如果在traits类中实现了相应的相交谓词和构造函数,则相交查询可以支持任何类型
距离查询仅限于点查询
「官方提供的例子」
相交查询:针对三角形集的线对象(射线、线、线.
#include
#include
typedef CGAL::Simple_cartesian Kernel; //这个kernel 决定了点云的一些特性, 和精度 double。
typedef Kernel::Point_2 Point_2; //先记住这个形式!
typedef Kernel::Segment_2 Segment_2; //记住这个形式!
int main()
1Three Points and One Segment
第一个例子是创建3个点和一条线段,并且在其上进行一些操作。
所有的CGAL头文件都在CGAL目录下。所有的CGAL类和函数都在CGAL的命名空间。类以大写字母开头,常量全大写,全局函数名小写。对象的空间维度由后缀给出。
几何元,如点,在一个kernel中定义...