在MATLAB中找到两个向量之间的交点

Mav*_*ick 13 math matlab

我有一个非常简单的MATLAB问题.找到两个向量之间交点的最简单方法是什么.我不熟悉各种MATLAB函数 - 似乎应该有一个这样的.

例如,如果我有一个从(0,0)到(6,6)的向量和另一个从(0,6)到(6,0)的向量,我需要确定它们在(3,3)处相交.

gno*_*ice 13

一种解决方案是使用本教程中派生的方程式来找到2-D中两条线的交叉点(更新:这是一个因特网档案链接,因为该站点不再存在).您可以先创建两个矩阵:一个用于保存线端点的x坐标,另一个用于保持y坐标.

x = [0 0; 6 6];  %# Starting points in first row, ending points in second row
y = [0 6; 6 0];
Run Code Online (Sandbox Code Playgroud)

然后可以将来自上述源的等式编码如下:

dx = diff(x);  %# Take the differences down each column
dy = diff(y);
den = dx(1)*dy(2)-dy(1)*dx(2);  %# Precompute the denominator
ua = (dx(2)*(y(1)-y(3))-dy(2)*(x(1)-x(3)))/den;
ub = (dx(1)*(y(1)-y(3))-dy(1)*(x(1)-x(3)))/den;
Run Code Online (Sandbox Code Playgroud)

现在,您可以计算两条线的交点:

xi = x(1)+ua*dx(1);
yi = y(1)+ua*dy(1);
Run Code Online (Sandbox Code Playgroud)

对于问题中的示例,上面的代码给出了,xi = 3并且yi = 3如预期的那样.如果要检查交叉点是否位于线的端点之间(即它们是有限线段),则只需检查值ua并且ub两者都介于0和1之间:

isInSegment = all(([ua ub] >= 0) & ([ua ub] <= 1));
Run Code Online (Sandbox Code Playgroud)

我上面链接的教程还有几点:

  • 如果分母den为0,则两条线是平行的.
  • 如果用于方程的分母和分子uaub是0时,则两条线重合.


Azi*_*zim 8

那么,你真的在​​两条不同的线上有两个点,你想要找到交点.最简单的方法是找到两条线的方程,然后计算交点.

线的方程由y = mx + b给出,其中m是斜率,b是y轴截距.对于一条线,您有两个点,它给出两个方程.因此,您可以求解常数mb.这给出了以下两个方程式:

 0 = 0*m + 1*b  % Using the first point x=y=0 into y=m*x+b
 6 = 6*m + 1*b  % Using the second point x=y=6
Run Code Online (Sandbox Code Playgroud)

或者以矩阵形式:

 [ 0 ] = [ 0 1 ]* [ m ]
 [ 6 ]   [ 6 1 ]  [ b ]
Run Code Online (Sandbox Code Playgroud)

对于第一行,常量可以在MATLAB中计算

 C1 = inv([0 1;6 1]*[1;0]; % m=C1(1) and b=C(2)
Run Code Online (Sandbox Code Playgroud)

现在您已经得到了两条线的等式,您可以通过求解下面的方程组(通过操纵线的方程获得)来求解交点:

 m_1*x-y = -b_1
 m_2*x-y = -b_2
Run Code Online (Sandbox Code Playgroud)

剩下的就是以矩阵形式编写上述方程组并求解:

 [x] = inv [m_1 -1] * [-b_1]
 [y]       [m_2 -1]   [-b_2]
Run Code Online (Sandbox Code Playgroud)

或者在MATLAB语法中:

 I = inv([m_1 -1; m_2 -1])*[-b_1;-b_2]; % I is the intersection.
Run Code Online (Sandbox Code Playgroud)

笔记

  • 根据gnovice的注释,如果线条实际上是线段,则需要检查线条是否在线段的端点之间.

  • 如果两个斜率相等,m_1 = m_2,那么将没有交叉点或无限多个交点.

  • 对于AX = B,如果A是正方形和可逆的,那么X = inv(A)*B理论上与X = A\B相同.但是涉及反斜杠运算符的计算更可取,因为它们需要更少的计算机时间,更少的内存,并且具有更好的错误检测属性.请参阅http://www.mathworks.com/access/helpdesk/help/techdoc/math/f4-983672.html和http://www.mathworks.com/access/helpdesk/help/techdoc/math/f4- 2224.html了解更多解释 (4认同)
  • 还有一点:如果将两条线视为线*段*,则需要进行额外检查以查看交点是否位于每条线的终点内. (3认同)