我编写了一个代码,该代码应按照以下公式计算两个给定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)
我做错了什么?
答案 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;
将修复您的代码。