在实现TextMountain时,生成TCBP时需要计算文本区域点到四条边的距离,由于计算量大,所以最好是使用矩阵运算,提高运行效率。

基础讲解:由于需要使用到矩阵运算,最好采用向量的方法来进行表示。

为了讲述方便,我们设直线为x轴,用向量oq表示,对于点p,要计算p到直线oq的距离,我们可以任取直线上一点(这里取o)得到向量op,根据图中公式可以求得点到直线的垂足d到点p的向量dp(x,y),则点到直线的距离为sqrt(x*x+y*y)

编程实现

            def get_pt_line_dis(pt, line, lpt):'''获取点到直线的距离:param pt: 点坐标,[n,2]:param line: 直线向量 [m,2]:param lpt: 直线上的一个点 [m,2]:return: 点与直线的距离以及直线到点的垂直单位向量'''EPS=10-9pt = np.tile(pt[:, np.newaxis, :], (1, line.shape[0], 1)) #[n,m,2]line = np.tile(line[np.newaxis, ...], (pt.shape[0], 1, 1)) #[n,m,2]lpt = np.tile(lpt[np.newaxis, ...], (pt.shape[0], 1, 1)) #[n,m,2]array_trans = pt - lpt #[n,m,2] array_trans[i,j]表示第i个点与第j条直线某端点组成的向量,图中oparray_temp = np.sum(array_trans * line, axis=2) / (line[..., 0] ** 2 + line[..., 1] ** 2) #[n,m] array_temp = np.tile(array_temp[..., np.newaxis], (1, 1, 2)) #[n,m,2]array_temp = array_temp * line #[n,m,2]计算图中odv = array_trans - array_temp #图中dp [n,m,2] v[i,j]表示第i个点与第j条直线的垂直向量distance = np.linalg.norm(v, axis=2)v = v / (distance[..., np.newaxis] + EPS)return distance, v

导读

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

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

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

利用距离公式来计算距离

原理

  • 求解直线方程

根据两点式直线方程:
x − x 1 x 2 − x 1 = y − y 1 y 2 − y 1 \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)是直线上的一个点,我们利用直线的斜率相等原则,通过两个点求斜率,就可以得到下面的公式:
y 2 − y 1 x 2 − x 1 = y − y 1 x − x 1 \frac{y_2-y_1}{x_2-x_1}=\frac{y-y_1}{x-x_1} x2​−x1​y2​−y1​​=x−x1​y−y1​​
其实下面的这个式子和上面的是等价的,接下来我们将两点式的直线方程,转换成 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0形式的直线方程,以便于我们后面计算距离
 ​(y2​−y1​)∗(x−x1​)=(y−y1​)∗(x2​−x1​)(y2​−y1​)∗x+(x1​−x2​)∗y+x1​∗(y1​−y2​)+y1​∗(x2​−x1​)=0​
所以
 ​A=y2​−y1​B=x1​−x2​C=x1​∗(y1​−y2​)+y1​∗(x2​−x1​)​

  • 计算点到直线的距离
    根据点到直线的距离公式:
     A2+B2 ​∣A∗x0​+B∗y0​+C∣​

代码

import numpy as npdef get_distance_from_point_to_line(point, line_point1, line_point2):#计算直线的三个参数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)+1e-6)return distance

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

原理


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

代码

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. Matlab中点到直线距离计算

    P-点坐标:Q1, Q2线上两点坐标 三维空间复制内容到剪贴板代码: d = norm(cross(Q2-Q1,P-Q1))/norm(Q2-Q1); 二维空间 d = abs(det([Q2-Q1, ...

  2. 数据处理(一):点到直线距离

    1 点到直线距离计算 import mathdef getDis(pointX,pointY,lineX1,lineY1,lineX2,lineY2):#这里的XY代表要求的点,(x1,y1)(x2, ...

  3. 计算几何基础知识 叉乘、点乘、点到直线距离、叉积方向法等

    一.几何 常考却不怎么掌握的: ​ 数据结构:分块 ​ 字符串:后缀数组.后缀自动机 ​ 数学:FFT.DFT.NTT.杜教筛.拉格朗日插值等 ​ 图论:网络流.最小费用最大流 ​ 动规:五边形数优化 ...

  4. [原创]物探小宽线坐标快速生成(平行线坐标互算 、点到线距离计算、两线交点计算等)...

    界面如下: 下载地址:CSDN 功能简介: 主要是解决并简化各项目中坐标(特别是是斜测线坐标方程组)的重复脑残计算问题,降低脑残机率,为懒而生 1.对于斜线.规则线坐标理论快速生成等 2.两线交点的标 ...

  5. 已知两点求直线一般方程、点到直线距离、点是否在线上方/下方

    struct Point {double x = 0.0;double y = 0.0; }//直线方程 Ax + By + C = 0: Point pt1; Point pt2; double A ...

  6. 数学:SVM(2)点到直线距离

    点到直线距离 点P0:(x0,y0) 直线L0:ax + by + c = 0 即 WTX + b,其中W为列向量<a,b>,X为列向量<x,y> 首先,过点P0必有一条和直线 ...

  7. matlalb与python编程进行动力总成悬置模态计算对比——困惑待解

    matlalb与python编程进行动力总成悬置模态计算对比--困惑待解 1.困惑 以前用python编程算动力总成悬置系统模态时,有时有少量误差,困惑的很,为了搞清原因,将整个理论建模及算法重新研究 ...

  8. python计算矩形周长_一边学编程,一边学语数外,用python编程学三年级周长计算...

    原标题:一边学编程,一边学语数外,用python编程学三年级周长计算 编程并不神秘 编程只是解决问题的一共方法 python是一门编程语言 python是一种解决问题的编程工具 在小学阶段,学习编程的 ...

  9. 二维空间点到直线垂足计算公式推导及Java实现——学习笔记

    二维空间点到直线垂足计算公式推导及Java实现 前言 公式推导 代码实现 画蛇添足 前言 简单的公式推导,大概是高中程度的知识了.不管以前学的好不好,很久不用的东西,一上手还是有点懵的.推导一遍也是为 ...

  10. java点到直线距离_求取点到直线的距离

    问题描述: 已知点P(px,py),直线L(P1,P2),求点P到L的距离. 首先,推导直线公式: 点$$P_1(x_1,y_1)$$, 点$$P_2(x_2,y_2)$$ 可知直线方程为: $$x( ...

最新文章

  1. BERT可视化工具bertviz体验
  2. python中字典的value可以为任意对象_Python对象作为字典值
  3. MYSQL性能调优及架构设计学习笔记-基础篇MYSQL架构组成
  4. python面试常用问题_Python面试中最常见的25个问题-结束
  5. php一句话后门学习(含免杀)
  6. [vue] 说说你对MVC、MVP、MVVM模式的理解
  7. counting sort (计数排序) algorithm
  8. 余数相同问题(信息学奥赛一本通-T1080)
  9. 班级的每日作业和任务目标
  10. [原创]利用DropDownlist来控制Textbox输入数字的精度
  11. 内屏损坏强制usb调试_反渗透膜工作压力及调试
  12. 【蓝桥杯】历年真题题目及题解汇总
  13. Java开发童年小游戏
  14. librdkafka交叉编译
  15. 垃圾邮件过滤python_手把手教你用 python 和 scikit-learn 实现垃圾邮件过滤-阿里云开发者社区...
  16. cs1.6一直连接服务器,CS1.6连接不上服务器解决办法
  17. 【004】VS2017配置OpenCV4.1.0
  18. dotnet Multi-platform App UI 多平台应用 UI 框架简介
  19. 浅析大规模DDOS防御架构-应对T级攻防
  20. [jzoj 1285] 奶酪厂 {贪心}

热门文章

  1. 全能电子地图_安利一个胜过Google Earth的地图软件——全能电子地图下载器
  2. 推荐10款适合C/C++开发人员的IDE
  3. linux scp 安装包,linux安装scp命令
  4. 更新pip版本至最新
  5. linux 有dll文件吗,linux上可以运行dll吗
  6. 01 超级搜索术——信息搜索:全面、快速查找全网你想要的任何信息、情报
  7. 从0到1打造自己的网络电话系统
  8. 可靠性测试审查checklist
  9. 【物联网开发】基于STM32和阿里云的室内温、湿、亮度监测系统(三)—— 设备端的传感器开发(DHT11和光敏电阻传感器)
  10. 华为HCIE认证考试简介