如何计算 MatLab 中两个二维向量之间的方向角?
How to compute directional angle between two 2D vectors in MatLab?
我正在尝试执行一个脚本来分析我的一些数据。我有三个点(p1、p2、p3)的位置信息。我想从向量 p1p2 中找到点 p3 的 angular 位移,如下图所示:
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 度),而不是所需的大负角。
就像提到的一些评论一样,我对您要使用 v2=p1-p3
还是 v2=p3-p1
感到有点困惑。无论如何,此方法适用于任何两个向量 v
和 u
,其中 u
是 reference 向量(我们正在测量角度的向量).
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
.
的符号
首先,考虑两个带坐标的二维向量之间的角度的更简单方法是将轴与坐标向量对齐,然后考虑两个向量之间的关系。使用下图,我们可以看到一个角度减去另一个角度可以得到一个相对角度。
来源: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 以匹配您的绘图。
我正在尝试执行一个脚本来分析我的一些数据。我有三个点(p1、p2、p3)的位置信息。我想从向量 p1p2 中找到点 p3 的 angular 位移,如下图所示:
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 度),而不是所需的大负角。
就像提到的一些评论一样,我对您要使用 v2=p1-p3
还是 v2=p3-p1
感到有点困惑。无论如何,此方法适用于任何两个向量 v
和 u
,其中 u
是 reference 向量(我们正在测量角度的向量).
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
.
首先,考虑两个带坐标的二维向量之间的角度的更简单方法是将轴与坐标向量对齐,然后考虑两个向量之间的关系。使用下图,我们可以看到一个角度减去另一个角度可以得到一个相对角度。
来源: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 以匹配您的绘图。