1

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

4

2 回答 2

4

首先,考虑两个 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 已更改以匹配您的绘图。

于 2015-02-26T00:08:20.977 回答
1

就像提到的一些评论一样,我对您是否要使用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

于 2015-02-26T00:04:24.533 回答