对不起,如果这个问题看起来很基本,但我还没能在网上找到一个好的答案。
我对矢量有点困惑,以及如何在matlab中使用它们。目前我有以下三对坐标(x和y):人1,人1和人2的未来位置。见:The three points in a 2d view
现在我想计算"从人1到人2"的矢量之间的角度。和#34;从人1到人1未来的矢量"。我发现了一些可以用向量做的matlab函数,但我不确定我实际上是在为每个向量使用正确的输入。
所以现在我的问题是如何使用这些坐标(以及它们之间的差异)来计算图像的角度?
答案 0 :(得分:5)
尽管StefanM的解决方案是一种非常常见的解决方案,但实际上计算成本很高,但最重要的是,当矢量很小和/或角度接近0或π时,不正确 - 它实际上可以产生略微负或稍微超过π的角度。
因此,它给出了一种虚假的鲁棒感。 我反而建议
theta = acos(min(1,max(-1, a(:).' * b(:) / norm(a) / norm(b) )));
更强大,更正确,在循环中运行时速度超过10倍,而且没有文档可以理解,因为它仍然主要与“经典”公式一致。
答案 1 :(得分:2)
我建议使用两个向量的点积的属性。为清楚起见,我还解释了有关数学的详细信息。如果您已经知道它,请跳过它。 以下等式解释了该属性。
你·v = | u || v | cosθ
来源: http://chortle.ccsu.edu/VectorLessons/vch07/vch07_8.html
左侧是点积。在2D情况下,u = [u1; u2]和v = [v1; V2]。然后,点积乘以每个维度的元素,然后求和。在这种情况下,因此u·v = u1 * v1 + u2 * v2。
在右侧,两个向量的范数成倍增加。对于向量x,2D向量的(欧几里德)范数被描述为(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指出点积中的错误。我不知道我在想什么
答案 2 :(得分:1)
答案 3 :(得分:0)
让我们这样称呼: (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;
答案 4 :(得分:0)
人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,结果是不确定的。