问题描述
我试图创建一个具有随机尺寸但大小为1的向量。这就是我的想法(删除了rand()函数,并将其替换为两段代码都通用的数字。 ):
float x = sqrt((4566%100)/100.f);
float y = sqrt(1.f-x);
printf("%f,%f\n",x,y);
printf("%f\n",(x*x)+(y*y));
输出是这样的:
0.812404,0.433124
0.847596
但是当我删除勾股定理的反函数时(代码看起来像这样):
float x = (4566%100)/100.f;
float y = 1.f-x;
printf("%f,x+y);
输出看起来像这样:
0.660000,0.340000
1.000000
基于我并不疯狂的假设,第一段代码的最后一行的输出应为1,上面打印的矢量应完全不同。我只能假设出错的地方是在sqrt
函数中。如果是,有人可以帮助我修复它,如果不是,可以帮助我识别我的错误吗?
解决方法
如果根据勾股定理,sqrt(x * x + y * y) = 1
,则y
不等于sqrt(1.f-x)
。应该是sqrt(1.f-x*x)
:
-
sqrt(x * x + y * y) = 1
- (正反两面)=>
x * x + y * y = 1
- (从两侧减去
x * x
)=>y * y = 1 - x * x
- (计算双方的平方根)=>
y = sqrt(1 - x * x)
鉴于x
的计算,该y
的计算是不正确的:
float y = sqrt(1.f-x);
您需要减去x
的平方:
float y = sqrt(1.f-x*x);
由于x
在0到1之间,因此x 2