我有两点,a
和b
。我需要计算它们之间的角度,所以我将它们视为矢量。但是,向量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
还是有更好的解决方案?
答案 0 :(得分:4)
vector具有幅度和方向,而a
和b
只是空间中的坐标点。将a
和b
视为向量时,您隐式将[0 0 0]
定义为两个向量的原点。但是,由于点a
位于[0 0 0]
,因此它将是一个长度为零的向量。
如果矢量长度为零,它指向哪个方向?答案是无处可去的。它没有指向任何方向,因此你无法找到它与另一个向量之间的角度。
我想也许你很难定义你的问题。您的坐标系是否具有[0 0 0]
以外的原点?你是否真的试图找到a
和b
形成的线与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