我有一个非常简单的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,则两条线是平行的.ua和ub是0时,则两条线重合.那么,你真的在两条不同的线上有两个点,你想要找到交点.最简单的方法是找到两条线的方程,然后计算交点.
线的方程由y = mx + b给出,其中m是斜率,b是y轴截距.对于一条线,您有两个点,它给出两个方程.因此,您可以求解常数m和b.这给出了以下两个方程式:
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,那么将没有交叉点或无限多个交点.