C++ 求任意原点的两个向量之间的角度

C++ 求任意原点的两个向量之间的角度,c++,math,vector,3d,angle,C++,Math,Vector,3d,Angle,我想知道当原点不是O(0,0,0),而是(a,b,c),其中a,b,c是变量时,如何得到图片上的角度 B是一个与a(d,e,f)和原点成90度角的点 图片如下: 首先,从A和B中减去原点: A = A - origin B = B - origin A = A - origin B = B - origin 然后,规范化向量: A = A / ||A|| B = B / ||B|| 然后找到A和B的点积: dot = A . B 然后求反余弦。这是你的角度: angle = acos(d

我想知道当原点不是O(0,0,0),而是(a,b,c),其中a,b,c是变量时,如何得到图片上的角度

B是一个与a(d,e,f)和原点成90度角的点

图片如下:


首先,从A和B中减去原点:

A = A - origin
B = B - origin
A = A - origin
B = B - origin
然后,规范化向量:

A = A / ||A||
B = B / ||B||
然后找到A和B的点积:

dot = A . B
然后求反余弦。这是你的角度:

angle = acos(dot)
(请注意,结果以弧度为单位。要转换为度,请乘以180再除以π。)

这里是使用GLM实现此方法的C++源代码:

float angleBetween(
 glm::vec3 a,
 glm::vec3 b,
 glm::vec3 origin
){
 glm::vec3 da=glm::normalize(a-origin);
 glm::vec3 db=glm::normalize(b-origin);
 return glm::acos(glm::dot(da, db));
}

首先,从A和B中减去原点:

A = A - origin
B = B - origin
A = A - origin
B = B - origin
然后取其震级比的反余弦:

angle = acos(|B|/|A|)
然后,角签名:

 double degrees(double radians)
{
    return (radians*180.0)/M_PI;
}

 double angle=atan2(v1.x*v2.x+v1.y*v2.y,v1.x*v2.y-v1.y*v2.x);
             angle=degrees(angle);

这与C++有什么关系?这是一个数学问题。谢谢你的代码片段。但是,返回类型应该是float,而不是glm:vec3。