添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
typedef CGAL :: Simple_cartesian < double > Kernel ; typedef Kernel :: Point_2 Point_2 ; typedef Kernel :: Segment_2 Segment_2 ; int main ( ) //定义两个二维点 Point_2 p ( 1 , 1 ) , q ( 10 , 10 ) ; cout << "p = " << p << endl ; cout << "q = " << q . x ( ) << " " << q . y ( ) << endl ; //两点间的平方距离 double sqDist_pq ; sqDist_pq = CGAL :: squared_distance ( p , q ) ; cout << "->两点间的平方距离:" << CGAL :: squared_distance ( p , q ) << endl ; //两点的中点 cout << "->两点间的中点:" << CGAL :: midpoint ( p , q ) << endl ; //两点确定一条直线 Segment_2 s ( p , q ) ; Point_2 m ( 5 , 9 ) ; cout << "m = " << m << endl ; //点到直线的距离 double sqDist_sm ; sqDist_sm = CGAL :: squared_distance ( s , m ) ; cout << "->点到直线的距离" << sqDist_sm << endl ; //判断三点的关系 cout << "->p 到 m 再到 q 三点的关系为(与先后顺序有关):" ; switch ( CGAL :: orientation ( p , m , q ) ) case CGAL :: COLLINEAR : cout << "三点共线\n" ; break ; case CGAL :: LEFT_TURN : cout << "三点构成左转\n" ; break ; case CGAL :: RIGHT_TURN : cout << "三点构成右转\n" ; break ; cout << "->p 到 q 再到 m 三点的关系为(与先后顺序有关):" ; switch ( CGAL :: orientation ( p , q , m ) ) case CGAL :: COLLINEAR : cout << "三点共线\n" ; break ; case CGAL :: LEFT_TURN : cout << "三点构成左转\n" ; break ; case CGAL :: RIGHT_TURN : cout << "三点构成右转\n" ; break ; return 0 ;

输出结果:

p = 1 1
q = 10 10
->两点间的平方距离:162
->两点间的中点:5.5 5.5
m = 5 9
->点到直线的距离8
->p 到 m 再到 q 三点的关系为(与先后顺序有关):三点构成右转
->p 到 q 再到 m 三点的关系为(与先后顺序有关):三点构成左转

2 点坐标为浮点数

使用浮点数进行几何运算,由于数值精度的问题,可能会出现意想不到的结果。

#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中定义...