【问题标题】:Calculate angle between two vectors matlab计算两个向量之间的角度matlab
【发布时间】:2017-03-20 13:34:35
【问题描述】:

如果这个问题看起来很基础,我很抱歉,但我还没有在网上找到好的答案。

我对向量以及如何在 matlab 中使用它们有点困惑。目前我有以下三对坐标(x 和 y):Person 1,Person 1 和 Person 2 的未来位置。见:The three points in a 2d view

现在我想计算“从人 1 到人 2 的向量”和“从人 1 到人 1 未来的向量”之间的角度。我发现了一些可以对向量执行此操作的 matlab 函数,但我不确定我实际上是否为每个向量使用了正确的输入。

所以现在我的问题是如何使用这些坐标(以及它们之间的差异)来计算图像的角度?

【问题讨论】:

  • 您能与我们分享您的代码吗?

标签: matlab vector angle


【解决方案1】:

人 1,(x1,y1)-未来人 1 ,(x11,y11)-人 2(x2,y2) 的坐标。

考虑 x11-x1=xa 和 y11-y1=ya 然后 x2-x1=xb 和 y2-y1=yb。

角度(vector.a,vector.b)=pi()/2*((1+sign(xa))(1-sign(ya^2))-(1+sign(xb) )(1-sign(yb^2)))

                    +pi()/4*((2+sign(xa))*sign(ya)-(2+sign(xb))*sign(yb))

                    +sign(xa*ya)*atan((abs(xa)-abs(ya))/(abs(xa)+abs(ya)))

                    -sign(xb*yb)*atan((abs(xb)-abs(yb))/(abs(xb)+abs(yb)))

对于 xa、ya、xb 和 yb 的任何值,该公式给出了从 0 到 2pi 的角度。

对于 xa=ya=0 和或 xb=yb=0,结果未定义。

【讨论】:

    【解决方案2】:

    虽然 StefanM 的解决方案是一个非常常见的解决方案,但它实际上计算量很大,但最重要的是,当向量很小和/或角度接近 0 或 π 时,不正确 - 它实际上可能会导致角度略微为负,或略微超过 π。

    因此,它给人一种鲁棒性的错误感觉。 我会建议

    theta = acos(min(1,max(-1, a(:).' * b(:) / norm(a) / norm(b) )));
    

    更健壮、更正确、在循环中运行时速度提高 10 倍以上,并且没有文档的外行也可以理解,因为它仍然大部分符合“经典”公式。

    【讨论】:

      【解决方案3】:

      我建议使用两个向量的点积的属性。为了清楚起见,我还解释了有关数学的详细信息。如果您已经知道,请跳过它。 以下等式解释了该属性。

      u·v = |u||v| cos θ

      来源: http://chortle.ccsu.edu/VectorLessons/vch07/vch07_8.html

      数学细节

      左边是点积。在二维情况下,u = [u1; u2] 和 v = [v1; v2]。然后点积将每个维度的元素相乘,然后求和。在这种情况下,因此 u · v = u1*v1 + u2*v2。

      在右侧,两个向量的范数相乘。一个二维向量的(欧几里得)范数被描述为向量 x 的 (x1^2 + x2^2)^(1/2)。

      代码

      现在我们讨论 Matlab 代码。我们需要一个函数来输出带有两个向量输入的 theta。

      function theta = calcAngleBetweenVectors(u, v)
      
      dotUV = dot(u, v);
      normU = norm(u);
      normV = norm(v);
      
      theta = acos(dotUV/(normU * normV));
      

      要改进您的功能,您应该检查有效的输入。在这种情况下,这些必须是 2D 向量,尽管该函数也适用于 2D。

      编辑:感谢 Ander Biguri 指出点积中的错误。我不知道我在想什么

      【讨论】:

      • 这是错误的。 u.*v 不给出uv 的点积
      • 感谢您对数学细节的解释,非常有用!
      【解决方案4】:

      让我们这样称呼这些点: (x1,y1)- 人 1, (x2,y2)- 未来人 1, (x3,y3)- person2。

      First_vec_angle=atan((y2-y1)/(x2-x1));
      Second_vec_angle=atan((y3-y1)/(x3-x1));
      
      Angle=Second_vec_angle-First_vec_angle;
      

      【讨论】:

        【解决方案5】:

        Matlab Central 为您的问题提供以下答案:

         theta = atan2(norm(cross(a,b)),dot(a,b));
        

        其中ab是位置相减得到的向量。

        【讨论】:

        • 请注意,这个比经典的cos 版本更健壮!
        • 这正是我想要的!谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        相关资源
        最近更新 更多