从任意起点开始,找到两个向量之间的夹角。

4
我想知道如何在图像的原点不是O(0,0,0)而是(a,b,c)的情况下获取图片上的角度,其中a,b和c是变量。
B是一个点,它与A(d,e,f)和原点呈90度。
图像在此处:

这与C++有什么关系?这是一个数学问题。 - Thomas Matthews
3个回答

12

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

A = A - origin
B = B - origin

然后,对向量进行归一化处理:

A = A / ||A||
B = B / ||B||

然后计算A和B的点积:

dot = A . B

然后找出反余弦。这就是你的角度:

angle = acos(dot)
(Note:结果以弧度为单位。要转换为角度,请乘以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));
}

感谢提供代码片段。但是返回类型应该是float,而不是glm:vec3。 - Ultroman the Tacoman
你如何从这个角度获取偏航和俯仰? - Jp Silver

2

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

A = A - origin
B = B - origin

然后取它们大小比值的反余弦:

angle = acos(|B|/|A|)

1

然后角度符号:

 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接