我正在开展一个项目。这里使用的每个变量都存储为double。
问题是我有一个带有两个坐标的2D速度矢量,我想计算矢量和OX轴之间的角度,所以我使用Theta1 = atan(v1y / v1x);
。尽管如此,通过这种方法我只能得到-PI / 2之间的角度; PI / 2,所以为了扩大我添加的范围
#define PI 3.14159265358979323846
double Theta1;
Theta1 = atan(v1y / v1x);
if (v1x < 0.0)
if (v1y > 0.0)
Theta1 = Theta1 + (PI/2.0);
else
Theta1 = Theta1 - (PI/2.0);
else;
当我尝试使用Theta1时,似乎不会被第一个if操作修改。我的意思是它永远不会添加(+/-)PI / 2.0,但如果我只是尝试
cout << Theta + PI/2.0 << endl;
它打印Theta1修改。我究竟做错了什么?这似乎是一些陷阱,或者我只是看不到简单的东西。
答案 0 :(得分:4)
切线的周期为π
,因此您的调整不正确,应为±π
。同样,当两个坐标都为负时,商atan
的结果为正,即0
和π/2
之间的值。然后你减去π/2
并得到-π/2
和0
之间的负值,但是你应该在几何上-π
和-π/2
之间得到一个。
另外,你应该使用atan2
,它可以在没有调整的情况下为你提供正确的角度。
答案 1 :(得分:1)
如果v1x
大于或等于零,则不会修改Theta
,因为它会输入外else
语句的if
子句,其中包含否代码。
如果v1x
为负,那么,如果没有编译器错误,Theta
将更改。我建议放置:
std::cout << Theta1 << '\n';
在if
声明之前和之后立即进行验证。