[英]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
感到有些困惑。 无论如何,此方法将适用于任意两个向量v
和u
,其中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.