如何计算3D空间中两个向量的反射角?

时间:2010-03-16 13:13:33

标签: vector algebra angle linear

我想计算两个向量a和b之间的角度。让我们假设这些是起源。这可以通过

完成
theta = arccos(a . b / |a| * |b|)

然而,arccos给你的角度为[0,pi],即它永远不会给你一个大于180度的角度,这就是我想要的。那么你怎么知道矢量何时超过180度?在2D中,我只需让其中一个向量上的y分量符号确定向量所在的象限。但是在3D中最简单的方法是什么?

编辑:我想保持这个问题的一般性,但是我们走了。我正在使用c编程,我用来获取角度的代码是theta = acos(dot(a, b)/mag(a)*mag(b)),那么你将如何以编程方式确定方向?

4 个答案:

答案 0 :(得分:2)

这适用于2D,因为您定义了一个定义旋转的平面。

如果要在3D中执行此操作,则不存在此类隐式2D平面。您可以将3D坐标转换为通过所有三个点的2D平面,并在此平面内进行计算。

但是,平面当然有两种可能的取向,这将影响哪些角度> 180或更小。

答案 1 :(得分:1)

我提出了以下解决方案,它利用了两个向量的叉积的方向变化:

  1. 制作一个向量n = a X b并对其进行规范化。此向量垂直于a和b跨越的平面。

  2. 每当计算新角度时,将其与旧法线进行比较。在比较中,将旧法线和当前法线视为点并计算它们之间的距离。如果该距离是正常的2(即X b已经翻转的叉积)。

  3. 您可能希望获得距离的阈值,因为翻转后的距离可能小于2,具体取决于矢量a和b的方向以及更新角度的频率。

答案 2 :(得分:0)

严格来说,两个3D矢量之间总是有两个角度 - 一个低于或等于180,另一个高于或等于180.Arccos为您提供其中一个,您可以获得另一个从360减去。想一想:想象两条线相交。那里有4个角度 - 一个值为2个,另一个值为2个。线条之间的角度是多少?没有一个答案。同样在这里。如果没有某种额外的标准,理论上你不能指出应该考虑哪两个角度值。

编辑:所以你真正需要的是一个固定方向的任意例子。这是一个:我们从正Z方向看。如果两个矢量之间的平面包含Z轴,我们从正Y方向看。如果平面是YZ,我们从正X方向看。我会考虑如何以坐标形式表达,然后再次编辑。

答案 3 :(得分:0)

您可以使用的一种解决方案:
你真正需要做的是创建一个平面,其中一个向量是共面的。

获取两个向量的叉积将创建一个平面,然后你得到这个平面的法线,你可以得到这个和你需要得到有角度的向量之间的角度,你可以使用角度确定标志。
如果角度大于90度,则它低于创建的平面;小于90度,它在上面 根据计算成本,可以在此阶段使用点积而不是角度。

确保始终按照相同的向量顺序计算法线。

如果您正在使用XYZ轴,这可以更容易使用,这就是您要比较的内容,因为您已经拥有了飞机所需的矢量。

可能有更高效的解决方案,但这是我提出的解决方案。

编辑:澄清创建的向量 a X b = p。这与ab都垂直。 然后,做任何一个: a X pb X p创建另一个向量,该向量是由2个向量创建的平面的法线。矢量的选择取决于你想要找到的角度。