【问题标题】:C++ Calculate Angle (0 to 360) Between Two 3D VectorsC++ 计算两个 3D 向量之间的角度(0 到 360)
【发布时间】:2017-05-03 01:14:48
【问题描述】:

假设我有 2 个 3D 向量

Vec3 v1, v2;

v1.x = 203;
v1.y = 355;
v1.z = 922;

v2.x = 6;
v2.y = 13;
v2.z = 198;

如何计算v1v2 之间的角度? IE。最终答案将在0360 之间

我试过了

Vec3 angle = v1 - v2;

还有其他一些事情,但我似乎无法让它正常工作。

【问题讨论】:

  • @TimBiegeleisen 我的问题没有得到解答
  • 您需要做的就是弄清楚 C++ 有哪些数学函数。我似乎记得有一个math.h 头文件。
  • 您不确定计算角度的数学方法,还是不确定如何将数学转换为代码?
  • 你最终是如何解决的?我很感兴趣,因为我有同样的问题。

标签: c++ math 3d trigonometry angle


【解决方案1】:

为此,您需要使用dot product,一旦使用,您可以关注standard method。 示例:

#include <cmath>

float dot(Vec3 a, Vec3 b)  //calculates dot product of a and b
{
    return a.x * b.x + a.y * b.y + a.z * b.z;
}

float mag(Vec3 a)  //calculates magnitude of a
{
    return std::sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}

int main()
{
    Vec3 v1, v2;

    v1.x = 203;
    v1.y = 355;
    v1.z = 922;

    v2.x = 6;
    v2.y = 13;
    v2.z = 198;

    float angle = std::acos(dot(v1,v2)/(mag(v1)*mag(v2)));
}

【讨论】:

  • @mireazma 你预计会发生什么?
  • 我不明白你的问题。阅读您的解决方案后,我希望它返回 0 到 180 度之间的角度。但在阅读之前,我期待您的答案返回 0 到 360 之间的角度。正确的期望是什么?
  • @mireazma 向量没有固定的方向,它是相对于向量的,因此角度不能大于 180 度。您将始终获得最小的角度,30 与 330 相同。请记住,点积可以返回两个相反的面向向量中的任何一个,具体取决于哪个方向被定义为正。如果您使用平面,并说两个向量都位于所述平面上,则可以使用该平面法线作为恒定的正方向,这将为您提供 360 度范围内的结果。你只需要找到那架飞机的行列式。
  • 感谢您的信息。我想知道首先使用叉积并跟踪向量顺序是否有可能(希望如此)。如果不是,我认为理论上可以通过使用四元数,在 2 个 3D 向量的情况下。
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多