1

我想计算两个向量 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

4 回答 4

2

这适用于 2D,因为您定义了一个平面,您可以在其中定义旋转。

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

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

于 2010-03-16T13:22:23.383 回答
1

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

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

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

您可能需要一个距离阈值,因为翻转后的距离可能小于 2,具体取决于向量 a 和 b 的方向以及更新角度的频率。

于 2010-03-17T15:50:43.797 回答
0

严格来说,两个 3D 向量之间总是有两个角度 - 一个小于或等于 180,另一个大于或等于 180。Arccos 为您提供其中一个,您可以通过从 360 减去另一个。这样想: 想象两条线相交。你有 4 个角度 - 一个值的 2 个,另一个值的 2 个。线之间的角度是多少?没有单一的答案。同样在这里。如果没有某种额外的标准,理论上您无法判断应该考虑两个角度值中的哪一个。

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

于 2010-03-16T13:33:41.177 回答
0

您可以使用的一种解决方案:
您实际上需要做的是创建一个与其中一个向量共面的平面。

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

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

如果您使用的是 XYZ 轴,这将更容易使用,这就是您要比较的内容,因为您已经有了平面所需的向量。

可能有更有效的解决方案,但这是我想出的一个。

编辑:澄清创建的向量 a X b = p。这a与 和都垂直b。然后,执行以下任一操作: a X pb X p创建另一个向量,该向量与由 2 个向量创建的平面垂直。矢量的选择取决于您要寻找的角度。

于 2010-03-16T13:35:03.073 回答