【问题标题】:How to compute directional angle between two 2D vectors in MatLab?如何在 MatLab 中计算两个 2D 向量之间的方向角?
【发布时间】:2015-02-25 22:26:21
【问题描述】:

我正在尝试实现一个脚本来分析我的一些数据。我有三个点(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 度),而不是所需的大负角。

【问题讨论】:

  • 你应该有v1=p2-p1v2=p3-p1吗?
  • 我已经尝试过这种方法,但它实际上是所有的输出。不正确。当 p3 位于位置 a 时,此版本返回一个较大的正值 (103 度),而不是较小的负值 (-77),当 p3 位于位置 d 时,它返回一个较小的负值 (-16),而不是 a大的负值。
  • 您是要找到线 P1->P2 和 P1->P3 之间的角度,还是 P2->P1 和 P1->P3 之间的角度?
  • 我试图找到 P2->P1 和 P1->P3 之间的角度。对于命名时的混乱,我深表歉意。我也相信这会导致计算出现问题,因为当 P3 位于 P1 和 P2 的“前面”时,P2->P1 和 P1->P3 之间的角度确实是我想要的输出(图中的位置 a 和 b ),但是当 P3 位于位置 c 或 d 时,我相信它会返回两个向量之间的锐角,而不是所需的钝角。

标签: matlab vector angle atan2


【解决方案1】:

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

来源: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 已更改以匹配您的绘图。

【讨论】:

  • 我认为您需要对 angle>180 (-360) 和 angle<-180 (+360) 进行单独的更正。
  • sign() 语句说明了这一点。
  • 我刚刚实现了这个解决方案,它可以工作。你是这方面的英雄!几天来,我一直在努力解决这个问题。这个脚本是我当前研究的关键部分。我很乐意在脚本的注释中感谢您 - 如果您愿意,我会使用您的用户名或其他名称。
【解决方案2】:

就像提到的一些 cmets 一样,我有点困惑您是要使用 v2=p1-p3 还是 v2=p3-p1。无论如何,此方法适用于任意两个向量 vu,其中 ureference 向量(我们测量角度的向量)。

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

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多