繁体   English   中英

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

[英]How to compute directional angle between two 2D vectors in MatLab?

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

角度

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度),而不是所需的较大的负角。

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

资料来源: 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进行了更改以匹配您的图形。

就像提到的一些评论一样,我对于要使用v2=p1-p3还是v2=p3-p1感到有些困惑。 无论如何,此方法将适用于任意两个向量vu ,其中u参考向量(我们正在测量与之成角度的向量)。

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的符号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM