如何在MatLab中计算两个2D矢量之间的方向角?

时间:2015-02-25 22:26:22

标签: matlab vector angle atan2

我正在尝试实现一个脚本来分析我的一些数据。我有三个点的位置信息(p1,p2,p3)。我想从矢量p1p2中找到点p3的角位移,如下图所示:

angles

p3a,p3b,p3c,p3d显示p3的可能相对位置。如图所示,我想输出角度的符号来描述它与向量p1p2的相对位置。

我使用的代码如下(适用于图表):

v1 = p2 - p1;
x1 = v1(1);
y1 = v1(2);
v2 =  p1 - p3;
x2 = v2(1);
y2 = v2(2);
angle = atan2d(x1*y2-y1*2,x1*x2+y1*y2);

当p3处于p3a时,这可以正常工作,给出正确尺寸的负角度(-77度)。但是,当p3处于p3d时,它输出一个大的正角度(+ 150度),而不是所需的大负角度。

2 个答案:

答案 0 :(得分:4)

首先,考虑两个带坐标的二维矢量之间角度的更简单方法是将轴与坐标向量对齐,并考虑两个向量之间的关系。使用下图,我们可以看到通过从另一个角度减去一个角度可以找到相对角度。

来源:http://almaer.com/blog/uploads/atan2.png

要想看看我们可以说的图表

,这并不难
angle = atan2d(y2,x2) - atan2d(y1,x1)

但是,由于您的两个矢量都不知道沿坐标轴对齐,因此可能出现上述差异不在范围内(-180,180)的情况。这意味着我们需要在支票中编码以增加或减去360度以获得我们想要的角度:

if abs(angle) > 180
  angle = angle - 360*sign(angle)
end

注意,您使用的是一种反向表示法(CW正面),因此最终代码如下所示:

v1 = p1 - p2;
x1 = v1(1);
y1 = v1(2);
v2 = p3 - p1;
x2 = v2(1);
y2 = v2(2);
angle = atan2d(y1,x1) - atan2d(y2,x2)

if abs(angle) > 180
    angle = angle - 360*sign(angle)
end

其中v1和v2已更改为与您的绘图相匹配。

答案 1 :(得分:1)

与上面提到的一些评论一样,我对您是否要使用v2=p1-p3v2=p3-p1感到有些困惑。无论如何,此方法适用于任何两个向量vu,其中u引用向量(我们正在测量角度的向量)。< / p>

vx = v(1); vy= v(2); ux = u(1); uy = u(2);
va = -atan2d(vy,vx);         % angle of v relative to x-axis (clockwise = +ve)
ua = -atan2d(uy,ux);         % angle of u relative to x-axis (clockwise = +ve)
A = va - ua;                             % angle va relative to ua
A = A - 360*(A > 180) + 360*(A < -180)   % correction put in [-180,180]

这假设您希望将u顺时针方向作为正方向。否则你只需翻转A的标志。