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:点线面缓冲区分析案例