两点间距离、点到直线距离、点到线段距离、线段到线段距离
两点之间的距离
直接运用两点间距离公式 (x2-x1)^ 2+(y2-y1)^ 2开根号
//两点间距离
double getDistancePP(Point a,Point b)
{//这个代码是部分代码,有些逻辑没有展现完全,大家往下看!Point c(b.x-a.x,b.y-a.y);//返回一个新的点return c.abs();//取模
}
点到直线距离
通常给出3个点,其中两个点构成一条直线,求另外一个点到直线的距离,我们将点与点的关系转换为向量之间关系进而利用向量知识求出点到直线距离!
点到直线距离,我们可以利用外积的取模公式的几何意义,|axb|=|a|x|b|sinθ=所围成平行四边形面积,先求出向量a✖向量b的模,然后除以平行四边形底边边长|a|,最后用平行四边形面积除以底边边长就是高,也就是点到直线距离!
图解
不明白外积模的几何意义点击下方超链接
外积知识点大全
实现代码
//点到直线距离(利用外积平行四边形)
double getDistancePL(Point a,Point b,Point c)
{Vector ab(b.x-a.x,b.y-a.y);Vector ac(c.x-a.x,c.y-a.y);return cross(ab,ac)/ab.abs();//cross函数求两个向量的外积模,abs函数求向量模
}
点到线段距离
点到线段距离有一点复杂,因为线段不像直线那样可以无限延申,线段有端点,这就导致了点到线段距离可以分为3种情况!
第一种:点到线段距离等于点到直线的距离
图示
第二种:点到线段距离等于点到左端点的距离
图示
第三种:点到线段等于点到右端点的距离
图示
如何判断θ大小呢?
我们利用内积大小判断 a·b=|a|x|b|cosθ
如果a·b>0则θ在0~90°之间
如果a·b<0则θ在90°~180°之间
实现代码
//点到线段距离
double getDistancePS(Point a,Point b,Point c)
{//定义4个向量Vector ab(b.x-a.x,b.y-a.y);Vector ba(a.x-b.x,a.y-b.y);Vector ac(c.x-a.x,c.y-a.y);Vector bc(c.x-b.x,c.y-b.y);//dot函数用于求内积if(dot(ab,ac)<0.0) return getDistancePP(a,c);//到左端点距离if(dot(ba,bc)<0.0) return getDistancePP(b,c);//到右端点距离return getDistancePL(a,b,c);//点到直线距离
}
线段到线段距离
有了点到线段距离,求解线段到线段距离就容易多了!
首先、两个线段4个端点,我们分别用其中一个线段的一个端点,求出到另外一个线段的距离,在求出另一个端点到线段的距离,在更换线段,依次类推,我们求出4个不同的点到线段的距离,然后取最小值即可!
在代码中有一点我们暂时不考虑,就是两个线段相交的时候,那么他们的距离应该为0!
放在下一节学完两条线段相交的判定后直接添加一个if语句即可!
实现代码
//线段到线段的距离
double getDistanceSS(Point a,Point b,Point c,Point d)
{//从4个点到2线段距离中取最小return min(min(getDistancePS(c,d,a),getDistancePS(c,d,b)),min(getDistancePS(a,b,c),getDistancePS(a,b,d)));
}
完整代码
#include <bits/stdc++.h>using namespace std;class Point
{public:double x,y;Point(double x=0,double y=0):x(x),y(y) {}//向量加法Point operator+(Point p){return Point(x+p.x,y+p.y);}//向量减法Point operator-(Point p){return Point(x-p.x,y+p.y);}//向量伸缩Point operator*(double a){return Point(x*a,y*a);}Point operator/(double a){return Point(x/a,y/a);}//向量大小double abs(){return sqrt(norm());}//向量范数double norm(){return x*x+y*y;}bool operator<(const Point &p) const{return x!=p.x?x<p.x:y<p.y;}bool operator==(const Point &p)const{return x-p.x<1e-10&&y-p.y<1e-10;}};typedef Point Vector;//向量内积
double dot(Vector a,Vector b)
{return a.x*b.x+a.y*b.y;
}//向量外积
double cross(Vector a,Vector b)
{return abs(a.x*b.y-a.y*b.x);
}//正交
bool isOrthogonal(Vector a,Vector b)
{return a.x*b.x+a.y*b.y==0;
}
//平行
bool isParallel(Vector a,Vector b)
{return a.x*b.y-a.y*b.x==0;
}//投影
Point project(Point a,Point b,Point c)
{Vector ab(b.x-a.x,b.y-a.y);Vector ac(c.x-a.x,c.y-a.y);double r=dot(ab,ac)/ab.norm();//比例Vector h(ab*r);return Point(a.x+h.x,a.y+h.y);
}//映象Point reflect(Point a,Point b,Point c)
{//c到ab的投影点Point r=project(a,b,c);Vector cr(r.x-c.x,r.y-c.y);//cr扩大二倍Vector cr_2=cr*2;//上面重载过*//向量加法return Point(c.x+cr_2.x,c.y+cr_2.y);
}//两点间距离
double getDistancePP(Point a,Point b)
{Point c(b.x-a.x,b.y-a.y);return c.abs();
}//点到直线距离(利用外积平行四边形)
double getDistancePL(Point a,Point b,Point c)
{Vector ab(b.x-a.x,b.y-a.y);Vector ac(c.x-a.x,c.y-a.y);return cross(ab,ac)/ab.abs();
}//点到线段距离
double getDistancePS(Point a,Point b,Point c)
{//定义4个向量Vector ab(b.x-a.x,b.y-a.y);Vector ba(a.x-b.x,a.y-b.y);Vector ac(c.x-a.x,c.y-a.y);Vector bc(c.x-b.x,c.y-b.y);if(dot(ab,ac)<0.0) return getDistancePP(a,c);if(dot(ba,bc)<0.0) return getDistancePP(b,c);return getDistancePL(a,b,c);
}//线段到线段的距离
double getDistanceSS(Point a,Point b,Point c,Point d)
{//从4个点到2线段距离中取最小return min(min(getDistancePS(c,d,a),getDistancePS(c,d,b)),min(getDistancePS(a,b,c),getDistancePS(a,b,d)));
}
int main()
{int x0,y0,x1,y1,x2,y2,x3,y3;cin>>x0>>y0>>x1>>y1>>x2>>y2;Point a(x0,y0);Point b(x1,y1);cout<<"a,b两点间距离"<<getDistancePP(a,b)<<endl;Point c(x2,y2);cout<<"c点到直线ab距离"<<getDistancePL(a,b,c)<<endl;cout<<"c点到线段ab的距离"<<getDistancePS(a,b,c)<<endl;cin>>x3>>y3;Point d(x3,y3);cout<<"线段ab到线段cd的距离"<<getDistanceSS(a,b,c,d)<<endl;return 0;
}
线段的逆时针方向(顺时针、正上方、正下方、线段上)、相交判断
–>click–>click
两点间距离、点到直线距离、点到线段距离、线段到线段距离相关推荐
- 【Halcon 计算点到直线和点到直线延长线的距离】
Halcon 计算点到直线和点到直线延长线的距离 提示:Halcon计算点到直线的距离.(验证精度)点到直线延长线的距离 前言 实际项目进展过程中会应用到,计算直线与直线,点与直线距离计算,偶然发现, ...
- C++实现三维空间中点到点、点到直线、点到平面的距离计算
https://blog.csdn.net/yang_deyuan/article/details/78799961
- 点到线段的距离_直线垂直,垂线的性质,点到直线的距离
欢迎关注公z号:沈阳奥数 两条直线相交所成的四个角中,有一个角是直角时,就说这两条直线互相垂直,其中一条直线叫做另一条直线的垂线,它们的交点叫垂足. 如图,直线AB与CD垂直于点E,记作:AB⊥CD于 ...
- 点到直线的距离c语言程序,点到线段的距离 题解(C++)
初步分析 这道题之前有<点到直线的距离>一题. 如图,我们不妨来下个定义(名字是乱起的,如果有雷同就以以下定义为准): 对于任意线段l,在其两个端点上分别作垂直于l的直线,若点在两直线之间 ...
- 计算点到直线/线段的距离
计算目标点到直线/线段的距离,先计算直线/线段上距离目标点最近的点,目标点与最近点的距离,即目标点到直线/线段的距离. 计算最近点: //点到直线的最近点public void GetNear ...
- java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
12分高考答题必刷题型,"空间向量分析点到线的距离问题" 立体几何大题 立体几何在各地高考中,基本都占据20分以上的比例,在解答方法上,小题技巧相对比较丰富,但大题解答上有明显的规 ...
- 点到直线的投影公式_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
12分高考答题必刷题型,"空间向量分析点到线的距离问题" 立体几何大题 立体几何在各地高考中,基本都占据20分以上的比例,在解答方法上,小题技巧相对比较丰富,但大题解答上有明显的规 ...
- 过直线上一点画垂线图_苏教版四年级数学上册8.5认识垂直、点到直线的距离微课视频 | 练习...
微课视频第一课时 微课视频第二课时 同步练习 参考答案 教学设计 垂直 教材第89~91页的内容. 1.结合实际情境和操作活动,认识垂直. 2.能借助直尺.三角尺.量角器等工具画出已知直线的垂线,并理 ...
- 使用向量的方法来计算点到直线的距离
使用向量的方法效率更高,更简单. 首先要了解什么是向量,什么是向量的模 主要用到了解析几何里的几个公式 a * b = | a | * | b | * cos(x),其中x为向量a,b的夹角 | a ...
- 根据经纬度计算两点之间的距离、点到直线的距离
以下内容适合初学者,我用来评估跑路径跟踪结果的代码. 简单的看了其他人的博客,基本都是用半正矢公式(Haversine formula)计算距离的. 其中,a=lat1-lat2(经度差);b=lon ...
最新文章
- js里的匿名函数 数组排序
- KOMODO:用16S rDNA序列预测其培养基配方的网站
- 下列关于python的描述正确的是-以下关于Python中模块的说法正确的是(_____)。...
- php获取显示图书数据,php基于dom实现读取图书xml格式数据的方法
- Python中的四种交换数值的方法
- python 中间一列左对齐_Python|fstring我喜欢Python的原因之一
- 葫芦全身都是宝的飞鸽传书2011
- extjs 前后端分离_为什么我不喜欢「前后端分离」(个人观点,欢迎来喷)
- ubuntu 16.04安装网易云音乐
- kotlin 对话框_使用Kotlin的Android警报对话框
- PHP-Header缓存策略
- ffmpeg文档1:制作屏幕录像
- python中的scipy库_SciPy库学习
- Arduino手自两用蓝牙避障小车
- [乐意黎转载]从零开始学习jQuery (十) jQueryUI常用功能实战
- 泰坦尼克号——完美主义的杰作
- html里c3动画是什么,C3动画+H5知识点使用总结
- 连肝7个晚上,总结了计算机网络的知识点!(共66条)
- windows下ssh server搭建方法
- 地面分割:Fast Segmentation of 3D Point Clouds for Ground Vehicles