导读

在设计算法的时候经常需要用求一个点到另外两点组成的直线的距离,计算点到直线的距离主要有两种方法:

  1. 通过点到直线的距离公式来进行计算
  2. 利用向量来计算点到直线的距离

求点A(a,b)A(a,b)A(a,b)到直线上两点B(x1,y1)B(x_1,y_1)B(x1​,y1​)和C(x2,y2)C(x_2,y_2)C(x2​,y2​)的距离,下面让我们来看看这两种方法的原理和代码实现

利用距离公式来计算距离

原理

  • 求解直线方程

根据两点式直线方程:
x−x1x2−x1=y−y1y2−y1\frac{x-x_1}{x_2-x_1}=\frac{y-y_1}{y_2-y1} x2​−x1​x−x1​​=y2​−y1y−y1​​
而我比较喜欢这样记,(x,y)(x,y)(x,y)是直线上的一个点,我们利用直线的斜率相等原则,通过两个点求斜率,就可以得到下面的公式:
y2−y1x2−x1=y−y1x−x1\frac{y_2-y_1}{x_2-x_1}=\frac{y-y_1}{x-x_1} x2​−x1​y2​−y1​​=x−x1​y−y1​​
其实下面的这个式子和上面的是等价的,接下来我们将两点式的直线方程,转换成Ax+By+C=0Ax+By+C=0Ax+By+C=0形式的直线方程,以便于我们后面计算距离
(y2−y1)∗(x−x1)=(y−y1)∗(x2−x1)(y2−y1)∗x+(x1−x2)∗y+x1∗(y1−y2)+y1∗(x2−x1)=0\begin{aligned} & (y_2-y_1)*(x-x_1) = (y-y_1) * (x_2 - x_1)\\ & (y_2 - y_1)*x + (x_1-x_2)*y+x_1*(y_1-y_2)+y_1*(x_2-x_1)=0 \end{aligned} ​(y2​−y1​)∗(x−x1​)=(y−y1​)∗(x2​−x1​)(y2​−y1​)∗x+(x1​−x2​)∗y+x1​∗(y1​−y2​)+y1​∗(x2​−x1​)=0​
所以
A=y2−y1B=x1−x2C=x1∗(y1−y2)+y1∗(x2−x1)\begin{aligned} & A=y_2 - y_1 \\ & B = x_1 - x_2\\ & C = x_1*(y_1-y_2)+y_1*(x_2-x_1) \end{aligned} ​A=y2​−y1​B=x1​−x2​C=x1​∗(y1​−y2​)+y1​∗(x2​−x1​)​

  • 计算点到直线的距离
    根据点到直线的距离公式:
    ∣A∗x0+B∗y0+C∣A2+B2\frac{|A*x_0+B*y_0+C|}{\sqrt{A^2+B^2}} A2+B2​∣A∗x0​+B∗y0​+C∣​

代码

import numpy as npdef get_distance_from_point_to_line(point, line_point1, line_point2):#对于两点坐标为同一点时,返回点与点的距离if line_point1 == line_point2:point_array = np.array(point )point1_array = np.array(line_point1)return np.linalg.norm(point_array -point1_array )#计算直线的三个参数A = line_point2[1] - line_point1[1]B = line_point1[0] - line_point2[0]C = (line_point1[1] - line_point2[1]) * line_point1[0] + \(line_point2[0] - line_point1[0]) * line_point1[1]#根据点到直线的距离公式计算距离distance = np.abs(A * point[0] + B * point[1] + C) / (np.sqrt(A**2 + B**2))return distance

利用向量计算点到直线的距离

原理


我们将求点到直线的距离问题,转换为求三角形的高。三角形的底BC的长度已知,我们只需要求出三角形的面积即可。通过向量叉积三角形的面积计算公式如下:
SΔ=12∗AB→×AC→S_{\Delta}=\frac{1}{2} * \overrightarrow{\boldsymbol{AB}} × \overrightarrow{\boldsymbol{AC}} SΔ​=21​∗AB×AC
利用三角形面积相等原则,可以转换为
12∗AB→×AC→=12∗∣BC∣∗h\frac{1}{2} * \overrightarrow{\boldsymbol{AB}} × \overrightarrow{\boldsymbol{AC}} =\frac{1}{2}*|BC|*h 21​∗AB×AC=21​∗∣BC∣∗h
上式中的hhh就是我们需要求解的点到直线的距离

代码

import numpy as npdef point_distance_line(point,line_point1,line_point2):#计算向量vec1 = line_point1 - pointvec2 = line_point2 - pointdistance = np.abs(np.cross(vec1,vec2)) / np.linalg.norm(line_point1-line_point2)return distancepoint = np.array([5,2])
line_point1 = np.array([2,2])
line_point2 = np.array([3,3])
print(get_distance_from_point_to_line(point,line_point1,line_point2))
print(point_distance_line(point,line_point1,line_point2))

Python计算点到直线距离的两种方法相关推荐

  1. PCL点云处理之计算点到空间直线距离的四种方法(二十三)

    PCL点云处理之计算点到空间直线距离的四种方法(二十三) 问题表述 方法1 方法2 方法3 方法4 全部代码(四个函数) 问题表述 给定空间一条直线的两个点或者给定直线上一点和直线方向向量 求直线外一 ...

  2. python计算点到面的距离

    python计算点到面的距离 已知M个点,记P∈R^(M*3),目的是求M个点到平面Z= aX + bY + c的距离解法1: 使用平面的法向量来求解 平面Z= aX + bY + c的法向量为[a, ...

  3. Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)

    本文已在公众号 " 数据分析与商业实践 " 首发.关注一下~,更多商业数据分析案例源码等你来撩.后台回复 "异常值" ,即可获取本文的案例示范与包含详细注释的源 ...

  4. python直方图拟合曲线_用Python为直方图绘制拟合曲线的两种方法

    直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状.中心位置以及数据的离散程度等. 在python中一般采用matplotli ...

  5. 查询计算机上可用端口的两种方法

    在设备远程控制中,经常需要搜索设备上已安装端口号,例如在"计算机"→"设备"能看到的端口(COM和LPT).本文介绍的两种方法都是通过访问注册表实现的. 方法一 ...

  6. python hist直方图拟合曲线_详解用Python为直方图绘制拟合曲线的两种方法

    直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状.中心位置以及数据的离散程度等. 在python中一般采用matplotli ...

  7. python计算点到直线的距离_Python求平面内点到直线距离的实现

    近期遇到个问题,需要计算平面内点到直线的距离,发现数学知识都还给老师了,度娘后找到计算方法,特此记录. 点到直线的计算公式: 通过公式推导,得到信息: a:直线斜率 b:固定值-1 c:直线截距b 转 ...

  8. ArcGIS中计算点与线之间距离的两种方法

    数据准备:某地图软件下载的南京市域范围内村庄点位.公路网络(这里简单介绍下公路和城市道路的区别:①功能不同,公路主要是连接城市间.城乡间.乡村间供汽车行驶的公共道路,为区域间的交通联系服务,而城市道路 ...

  9. Python识别二维码的两种方法(cv2)

    在学习Python处理二维码的过程中,我们看到的大多是"用python生成酷炫二维码"."用Python制作动图二维码"之类的文章.而关于使用Python批量识 ...

  10. Python识别二维码的两种方法

    人生苦短,快学Python!大家好,我是朱小五 最近在搜寻资料时,发现了一则10年前的新闻:二维码将成线上线下关键入口.从今天的移动互联网来看,支付收款码/健康码等等与我们息息相关,二维码确实成为了我 ...

最新文章

  1. SQL获取刚插入的记录的自动增长列ID的值
  2. 浅入深出Vue:发布项目
  3. ubuntu系统操作常见错误
  4. java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)
  5. golang nil 不等于 nil的问题
  6. MongoDB一次节点宕机引发的思考(源码剖析)【华为云分享】
  7. OpenShift Security (12) - 用 RHACS 管理容器之间的网络访问策略
  8. 【leetcode】1023. Camelcase Matching
  9. matlab 虚数 .,关于MATLAB在复数方面的应用 – MATLAB中文论坛
  10. JSValidation 1.0b4 发布了!
  11. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache
  12. 买不买D50的N个理由
  13. html文件vbs病毒,一段病毒常用的VBS代码
  14. Innosetup 多种安装 vc_redist 运行库方式
  15. 升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!
  16. 云计算就业方向有哪些 未来的发展前景怎么样
  17. c++程序设计基础-类与对象:继承
  18. 应用程序如何隐藏标题栏
  19. SVAC-Intra-Prei 代码分析(帧内预测最佳预测角度的选择)
  20. 电子信息工程考研:12大专业方向解读

热门文章

  1. qqkey获取原理_编译原理(第3版)[刘铭][实验程序源代码]
  2. pytorch(11)-- crnn 车牌端到端识别
  3. android 炫酷图案解锁,16个超级漂亮的手机锁屏图案,炫酷到飞起,总有一款适合你...
  4. 计算机科学中的计算机思维在本质上源自于,计算思维对学习计算机知识有何作用?...
  5. Pycharm安装scrapy以及初始化爬虫项目
  6. Excel文件内容比对 -- Java Apache Poi
  7. 只要你想要,世界尽在眼前 —— 超级搜索术之资源搜索
  8. EN300328测试软件,EN300328是做什么测试
  9. 蓝牙驱动卸载后自动安装_外星人的控制中心下载,安装及常见问题处理方法
  10. 笔记本win10 1709 安装 v4w的教程