gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:51 25 4
gpt4 key购买 nike

我写了一个代码,它应该按照这个公式计算两个给定 3D vector 之间的角度:

$\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)

我做错了什么?

最佳答案

如果你用-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 初始化为零。

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

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

关于C:找到两个 3D vector 之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com