我正在尝试实现一个脚本来分析我的一些数据。我有三个点的位置信息(p1,p2,p3)。我想从矢量p1p2中找到点p3的角位移,如下图所示:
我使用的代码如下(适用于图表):
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度),而不是所需的大负角度。
答案 0 :(得分:4)
首先,考虑两个带坐标的二维矢量之间角度的更简单方法是将轴与坐标向量对齐,并考虑两个向量之间的关系。使用下图,我们可以看到通过从另一个角度减去一个角度可以找到相对角度。
来源: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已更改为与您的绘图相匹配。
答案 1 :(得分:1)
与上面提到的一些评论一样,我对您是否要使用v2=p1-p3
或v2=p3-p1
感到有些困惑。无论如何,此方法适用于任何两个向量v
和u
,其中u
是引用向量(我们正在测量角度的向量)。< / p>
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
的标志。