计算两个向量之间的角度(atan2不连续问题)

时间:2014-10-30 16:54:57

标签: c matlab math vector simulink

我有两个向量,我想计算它们之间的角度。

一个向量被定义为两个点P1(x1,y1)P2(x2,y2)。另一个向量定义为点P3(x3,y3)及其相对于x轴的航向角(比如theta)。

我知道我需要得到它们的产品,但是如何以两点的方式获得第二个向量?

实际上我试过使用atan2(),但是当角度在pi(+ - epsilon)附近时,它会从pi跳到-pi,这是不希望的,我不能简单地通过添加2 * pi来修复它角度小于零。在这种情况下,我的模拟从+ pi跳到-pi。

我正在使用C-mex S-functions,但任何pseudocode都可以。

非常感谢

1 个答案:

答案 0 :(得分:1)

here获取全部内容。请阅读那里的讨论以了解这个主题。

  

假设a = [x1,y1]和b = [x2,y2]是两个向量,其基数为   原点,逆时针测量它们之间的非负角度   

给出了a到b
angle = mod(atan2(x1*y2-x2*y1,x1*x2+y1*y2),2*pi);

对于MATLAB实现,mod可以替换为rem

angle = rem(atan2(x1*y2-x2*y1,x1*x2+y1*y2),2*pi);
  

量,x1 * y2-x2 * y1和x1 * x2 + y1 * y2分别是从向量a到向量b的逆时针角度的正弦和余弦乘以它们的范数的乘积 - 即,他们的交叉产品和点积限于二维。 ' atan2'函数然后给出它们之间的角度,范围从-pi到+ pi,以及' mod'操作将其更改为0到2 * pi。

请不要使用theta = acos(dot(a,b))等公式,因为pi-pi附近存在准确性问题。