两个3d向量之间的计算角度 - 如何实现

时间:2014-12-20 10:05:22

标签: c++ math casting implementation

我想计算两个3d矢量之间的角度。我使用以下等式(source of equation)来实现这一目标:

diffangle = atan2(norm(cross(v1,v2)),dot(v1,v2))

v1和v2的组件在数据类型float中给出,但由于我的角度很小,我希望在double类型中有不同的角度。我的实际实现如下:

double angle(float x1, float y1, float z1, float x2, float y2, float z2)
{
    double dot = x1*x2 + y1*y2 + z1*z2;
    double crossX = y1*z2-z1*y2;
    double crossY = z1*x2-x1*z2;
    double crossZ = x1*y2-y1*x2;
    double norm = sqrt(crossX*crossX+crossY*crossY+crossZ*crossZ);
    return (atan2(norm,dot)/M_PI*180);
}

我的实施是应该做什么或者我必须考虑某事或考虑其他因素?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

关于准确性的问题:在C(和C ++)中,当参与计算的双重时,浮点数将被提升为加倍(从int到long int的提升相同)。

所以表达式

 double z = x*y; 

首先以单精度(x*y)计算float,然后将结果转换为double。要使用双精度实际执行计算,您需要转换表达式中涉及的一个元素:

 double z = (double)x*y;

然而,最简单的解决方案是将函数声明更改为接受double。这样,调用函数时将提升float值,并且所有计算都将使用双精度。