没有参考平面上的两个向量之间的带符号的角度(Signed angle between two vec

2019-07-28 22:36发布

(在三个维度)我正在寻找一种方式来计算两个向量之间的带符号的角度,给予不高于载体的其他信息。 正如在回答了这个问题 ,这是很简单的计算给出的垂直于该矢量是垂直的平面内的带符号的角度。 但我能找到没有办法做到这一点没有该值。 很显然,两个向量的叉积产生这样一个正常的,但我已经运行到使用上述回答以下矛盾:

signed_angle(x_dir, y_dir) == 90
signed_angle(y_dir, x_dir) == 90

在那里我希望第二个结果为阴性。 这是由于这样的事实,叉积cross(x_dir, y_dir)是在相反的方向cross(y_dir, x_dir)给出下面的伪码与标准化输入:

signed_angle(Va, Vb)
    magnitude = acos(dot(Va, Vb))
    axis = cross(Va, Vb)
    dir = dot(Vb, cross(axis, Va))
    if dir < 0 then
        magnitude = -magnitude
    endif
    return magnitude

我不相信目录将永远是负面的上方。

我已经看到了建议的解决方案ATAN2同样的问题。

我正在寻找一种方法,使:

signed_angle(a, b) == -signed_angle(b, a)

Answer 1:

相关的数学公式:

  dot_product(a,b) == length(a) * length(b) * cos(angle)
  length(cross_product(a,b)) == length(a) * length(b) * sin(angle)

对于3-d向量之间的稳健角度,你的实际的计算应该是:

  s = length(cross_product(a,b))
  c = dot_product(a,b)
  angle = atan2(s, c)

如果你使用acos(c)独自一人,你会得到例重症精度问题时,角度较小。 计算s和使用atan2()为您提供所有可能的情况下,一个强大的结果。

由于s总是非负的,所得到的角度范围从0到pi。 总会有一个等效的负角度(angle - 2*pi)但没有几何理由,更喜欢它。



Answer 2:

没有参考平面上的两个向量之间的带符号的角度

angle = acos(dotproduct(normalized(a), normalized(b)));

signed_angle(A,B)== -signed_angle(B,A)

我认为,如果没有某种参考向量这是不可能的。



Answer 3:

感谢所有。 这里审查意见,在我试图做回头后,我意识到,我可以完成我需要一个符号的角度给定的,标准公式做。 我刚刚在单元测试中挂了我的带符号的角度的功能。

作为参考,我喂养所得角回一个旋转功能。 我未能考虑到以下事实,这将自然地使用相同的轴线在signed_angle(输入向量的叉积),和旋转的正确方向将按照从以往方向轴朝向。

更简单地说,这两个应该只是“做正确的事”,并在不同的方向旋转:

rotate(cross(Va, Vb), signed_angle(Va, Vb), point)
rotate(cross(Vb, Va), signed_angle(Vb, Va), point)

其中第一个参数是所述旋转轴线和第二是旋转的量。



Answer 4:

如果你想要的是一个一致的结果,那么A×B 为您的正常会做之间进行选择的任意方式。 或许,挑一个最字典顺序变小?

(但你可能要解释你其实是想解决什么问题:也许有,不涉及计算任意3向量之间的一致的符号的角度解决方案)



文章来源: Signed angle between two vectors without a reference plane