1

我正在做一个项目。此处使用的每个变量都存储为双精度。问题是我有一个带有两个坐标的二维速度矢量,我想计算矢量和 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。我究竟做错了什么?似乎要么存在一些陷阱,要么我只是看不到一些简单的东西。

4

2 回答 2

4

切线的周期是π,所以你的调整不正确,应该是±π。照原样,当两个坐标都为负时,商和 的结果atan将为正,一个介于0和之间的值π/2。然后你减去并在和π/2之间得到一个负值,但你应该在几何上在和之间得到一个。-π/20-π/2

此外,您应该使用atan2,它可以为您提供正确的角度而无需调整。

于 2013-06-14T22:29:51.257 回答
1

如果v1x大于等于零,Theta则不会被修改,因为它进入else了外部if语句的子句,其中不包含任何代码。

如果v1x 负数,那么缺少编译器错误,Theta 将会改变。我建议放置:

std::cout << Theta1 << '\n';

声明前后立即if进行验证。

于 2013-06-14T22:25:46.457 回答