我想计算两个向量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))
,那么你将如何以编程方式确定方向?
答案 0 :(得分:2)
这适用于2D,因为您定义了一个定义旋转的平面。
如果要在3D中执行此操作,则不存在此类隐式2D平面。您可以将3D坐标转换为通过所有三个点的2D平面,并在此平面内进行计算。
但是,平面当然有两种可能的取向,这将影响哪些角度> 180或更小。
答案 1 :(得分:1)
我提出了以下解决方案,它利用了两个向量的叉积的方向变化:
制作一个向量n = a X b
并对其进行规范化。此向量垂直于a和b跨越的平面。
每当计算新角度时,将其与旧法线进行比较。在比较中,将旧法线和当前法线视为点并计算它们之间的距离。如果该距离是正常的2(即X b已经翻转的叉积)。
您可能希望获得距离的阈值,因为翻转后的距离可能小于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
。这与a
和b
都垂直。
然后,做任何一个:
a X p
或b X p
创建另一个向量,该向量是由2个向量创建的平面的法线。矢量的选择取决于你想要找到的角度。