Matlab中两个向量之间的角度

时间:2010-12-02 15:47:45

标签: math matlab geometry

我有两点,ab。我需要计算它们之间的角度,所以我将它们视为矢量。但是,向量a将始终定义为[0 0 0]。阅读MATLAB新闻阅读器“Angle between two vectors”,提供了三种解决方案:

x1 = 0;
y1 = 0;
z1 = 0;
x2 = 0;
y2 = 1;
z2 = 0;
a = [x1,y1,z1]; b= [x2,y2,z2];

theta = rad2deg(atan2(norm(cross(a,b)),dot(a,b)))
theta = rad2deg(acos(dot(a,b)))
theta = rad2deg(atan2(x1*y2-x2*y1,x1*x2+y1*y2)) 

然而,由于acos具有准确度问题,因为theta接近于零,但在这三个等式中,只有acos提供了正确的解决方案。

我应该继续使用acos还是有更好的解决方案?

2 个答案:

答案 0 :(得分:4)

vector具有幅度和方向,而ab只是空间中的坐标点。将ab视为向量时,您隐式将[0 0 0]定义为两个向量的原点。但是,由于点a位于[0 0 0],因此它将是一个长度为零的向量。

如果矢量长度为零,它指向哪个方向?答案是无处可去的。它没有指向任何方向,因此你无法找到它与另一个向量之间的角度。

我想也许你很难定义你的问题。您的坐标系是否具有[0 0 0]以外的原点?你是否真的试图找到ab形成的线与x-y平面之间的角度?

答案 1 :(得分:-1)

错误是设置a = [0 0 0]。兴趣点以原点为中心,要计算相对于矢量b的角度,您需要指定点的行进方向。这可以通过设置a是一个单位向量来完成。

如果该点沿“x”方向行进,则x1=1

x1 = 1;
y1 = 0;
z1 = 0;
x2 = 0;
y2 = 1;
z2 = 0;
a = [x1,y1,z1]; b= [x2,y2,z2];

theta = rad2deg(atan2(norm(cross(a,b)),dot(a,b)))
theta = rad2deg(acos(dot(a,b)))
theta = rad2deg(atan2(x1*y2-x2*y1,x1*x2+y1*y2))

theta =
    90
theta =
    90
theta =
    90

问题解决了,忘记使用单位矢量:P