C:找到两个3D矢量之间的角度

时间:2017-04-27 17:34:03

标签: c vector

我编写了一个代码,该代码应按照以下公式计算两个给定3D矢量之间的角度:

$ \ theta = \ cos ^ { - 1} [\ frac {v.v'} {| v || v'|}] = \ cos ^ { - 1} [\ frac {aa'+ bb' + cc'} {\ sqrt {a ^ 2 + b ^ 2 + c ^ 2} \ sqrt {a'^ 2 + b'^ 2 + c'^ 2}}] $

这是代码:

#include <math.h>

float v1[3] = {0, 1, 2};
float v2[3] = {2, 2, 2};
float angle;

float dotProd(float *vec1, float *vec2) {
    return vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2];
}

float norm(float *vec){
    float res;
    for (int i=0; i<3; i++)
        res += pow(vec[i], 2);
    return sqrt(res);
}

float angleBetween(float *vec1, float *vec2){
    return acosf(dotProd(vec1, vec2) / (norm(vec1) * norm(vec2)));
}

int main(){
    angle = angleBetween(v1, v2) * 180 / M_PI;
    printf("%f", angle);
}

问题是它返回了一个错误的角度。 (我用geogebra检查过,右边的 v1 = {0,1,2},v2 = {2,2,2} 是39.2)

我做错了什么?

2 个答案:

答案 0 :(得分:3)

如果您使用-Wall进行编译,则会收到提示:

$ gcc -Wall angle.c
angle.c:14:9: warning: variable 'res' is uninitialized when used here [-Wuninitialized]
        res += pow(vec[i], 2);
        ^~~
angle.c:12:14: note: initialize the variable 'res' to silence this warning
    float res;

您希望将res初始化为零,大概是。

还有另一个警告,但它与此错误无关。不过,如果您使用#include,还需要stdio.h printf()标题。

养成打开警告的编译习惯。它可以为您节省大量的调试时间。

答案 1 :(得分:1)

您需要初始化变量,否则它们将包含为其分配的内存所包含的任何值。在这种情况下,将float norm(float *vec)的第一行更改为float res = 0.0;将修复您的代码。