数字信号处理7——点到向量的距离

目录

一、前言

二、点到线段的最短距离——向量法

三、点到直线的最短距离——直线法

四、点到直线最短距离——向量法


一、前言

       其实在工程应用中很多情况下计算点到直线或者点到线段的距离,比如在unity3d游戏软件设计中计算任意形状路径起点和终点连线距离最远的点,比如用于雷达聚类后在多目标跟踪算法中计算哪个sensor距离track最近,另外还需要知道要计算的点位于直线的哪一侧,这些计算在游戏开发或者数字信号后处理要求实时性,因此需要高效的运算。这里记录一下几种计算方法,方便需要时回忆。

需要记住的是点乘(内积)计算的一个向量在另一个向量上的投影cos,叉乘计算的是从同一点出发的两个向量,一个向量在距离另一个向量垂直距离sin

二、点到线段的最短距离——向量法

要求:计算平面一点到两点连成的线段,哪一个端点最近;另外计算点到两点形成向量的最短距离的计算(PC);

向量法计算在处理数据运算量多的地方相比联合求方程有显著的运算效率。

上面的 方向上的单位向量,其意义是给所求向量确定方向。是的两个向量的内积,且   ,其中θ为向量AP与AB之间的夹角是向量长度。

根据向量的方向性可以推出以下表达,分别对应上述的(a)(b)(c):

三、点到直线的最短距离——直线法

参考1中提供了8中不同的计算方法,可以开阔思维,但是工程中,我们更习惯使用简单的两点法求直线方程:

直线一般公式 为:

Ax+By+C =0;

直线外一点 (x0,y0) 到直线距离公式 :

d = (Ax0 + By0 + C) / sqrt(A ^ 2 + B ^ 2);

假设首尾两点 p1(x1, y1),p2(x2, y2), 待计算点 p3(x0, y0).

把p1,p2带入直线一般公式得:

Ax1 + By1 + c = 0 Ax2 + By2 + c = 0 Ax1 + By1 = Ax2 + By2, 两式得A(x1 - x2) = B(y2 - y1)

A = y2 - y1, B = x1 - x2 把A, B带入方程求解C: x1y2 - x1y1 + x1y1 - x2y1 + c = 0

求得 C =-(x1*(y2-y1)+y1*(x1-x2)) = x2y1 - x1y2, 将A,B,C带入点到直线距离公式可求得距离值:

总结起来:

d=\frac{(y2-y1)*x0+(x1-x2)*y0-(y2-y1)*x1-(x1-x2)*y1}{\sqrt{A^{2}+B^{2}}}

nx = -\frac{y1-y2}{\sqrt{A^{2}+B^{2}}}

nx = \frac{x1-x2}{\sqrt{A^{2}+B^{2}}}

n=-x1*nx-y1*ny

d=x0*nx+y0*ny+n

四、点到直线最短距离——向量法

向量法其实与直线法的求解结果一样,但是更直观也更容易理解。

假设首尾两点 A(x1, y1),B(x2, y2), 待计算点 P(x0, y0).

\overrightarrow{AB} = (x2-x1,y2-y1),\overrightarrow{AP} = (x0-x1,y0-y1)

|\overrightarrow{PC}| =\frac{|\overrightarrow{AB}X\overrightarrow{AP}|}{|AB|} =|AP|*sin(\Theta )

参考:

点到直线的八种计算方法(求解方法思路众多,但是运算着实麻烦):https://zhuanlan.zhihu.com/p/26307123

点到向量距离(核心思想有,但是有一些表达错误):https://blog.csdn.net/lkj345/article/details/80878128

unity3d 点到向量的距离算法(方法描述ok,但是求解两侧位置不如向量法直接):https://blog.csdn.net/qq_40795166/article/details/100030169

点到线段的最短距离:https://blog.csdn.net/angelazy/article/details/38489293

### 使用最小二乘法对数字信号进行数据拟合 为了理解如何利用最小二乘法对数字信号进行数据拟合,可以从理论背景入手。最小二乘法旨在找到一条直线或曲线,使得所有测量到这条线的距离平方之和达到最小值[^1]。 当应用于数字信号时,目标是最小化观测值与模型预测之间的差异。这通常涉及到构建一个数学模型来描述输入变量(时间或其他自变量)与输出变量(信号强度等因变量)间的关系。对于简单的线性关系,可以采用如下形式: \[ y(t) = a_0 + a_1 t \] 其中 \(y\) 表示响应变量(即信号),\(t\) 是独立变量(通常是时间),而 \(a_0, a_1\) 则是要估计的最佳参数。 #### MATLAB 实现代码 下面是一个具体的例子,在MATLAB环境中实现了上述概念,用于一维离散时间序列的数据拟合: ```matlab % 假设已知一组时间和对应的电压读数 time = linspace(0, 9, 10); % 时间向量 voltage = [0.5, 2.4, 3.7, 6.8, 9.1, 11.5, 13.8, 16.2, 18.5, 20]; % 测得的电压值 % 构造设计矩阵X (包含常数项列和时间列) X = [ones(length(time), 1), time']; % 应用正规方程求解最优系数A=[a0; a1] A = inv(X' * X) * X' * voltage'; disp('拟合得到的斜率和截距:'); disp(A); % 绘制原始数据及拟合后的直线 figure; plot(time, voltage, 'o', ... time, X*A, '-'); xlabel('Time(s)'); ylabel('Voltage(V)'); title('Linear Least Squares Fit of Voltage Data'); legend({'Original data','Fitted line'},... 'Location','Best') ``` 这段程序首先定义了一个时间轴`time`以及相应的模拟电压读数组成的向量`voltage`。接着创建了设计矩阵`X`,其包含了两个部分——一个是全为1的列代表偏置项,另一个则是时间本身构成的一列。之后通过调用正规方程计算出了最佳拟合直线的斜率(`a1`)和平移因子(`a0`)并打印出来。最后绘制图表展示原有位分布情况连同新近得出的理想趋势线。 此方法不仅限于线性回归分析;如果假设存在更复杂的函数关系,则可以通过调整设计矩阵的形式来进行多项式或者其他类型的非线性拟合[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值