CGAL学习之路:二维点线的基本操作:求中点平方距离点到直线的距离

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGAL学习之路:二维点线的基本操作:求中点平方距离点到直线的距离相关的知识,希望对你有一定的参考价值。

文章目录

1 点坐标为整数类型

描述: 以下代码对三个坐标均为整数的点(1,1)、(10,10)、(5,9)进行相关运算

代码:

#include <iostream>
#include <CGAL/Simple_cartesian.h>		//笛卡尔坐标相关头文件

using namespace std;

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矩阵的行列式,该行列式接近零但不等于零,因此前两组点不共线。

接近共线但为左转关系的点也可能发生类似情况,由于行列式计算过程中的舍入误差,可能会误判为共线或者右转。

以上是关于CGAL学习之路:二维点线的基本操作:求中点平方距离点到直线的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何用二分法求平方根???

GlobalMapper精品教程050:点线面缓冲区分析案例

LeetCode 279 完全平方数[动态规划] HERODING的LeetCode之路

什么是点线面

CGAL学习:数据类型

Windows环境下CGAL的安装