区别
atan(x)函数接收一个参数。参数类型可参考下列函数声明。
double atan (double x);
float atan (float x);
long double atan (long double x);
double atan (T x); // additional overloads for integral types
若有一个坐标A(a,b),则函数参数x=b/a。
atan(x)函数返回以弧度为单位的角度,范围为[-pi/2,+pi/2],注意是包含-pi/2和+pi/2的。该角度为A点和原点的连线与X轴正方向之间的夹角。上方夹角为正,下方夹角为负。由此可以看出,atan()函数只能区分一象限和四象限的点。取一象限和三象限任意一点Ai(ai,bi)计算x=bi/ai,x均为正值。对于二象限和四象限则均为负值。
atan参考
atan2(y,x)函数接收两个参数,即一个坐标值。参数类型可参考下列函数声明。
double atan2 (double y , double x);
float atan2 (float y , float x);
long double atan2 (long double y, long double x);
double atan2 (Type1 y , Type2 x); // additional overloads
atan2(x)函数返回以弧度为单位的角度,范围为[-pi,+pi],注意是包含-pi和+pi的。函数内部考虑了参数x,y 的符号。所以可以区分坐标点在哪个象限。
使用示例
static double
normalize(double z)
{
return atan2(sin(z),cos(z));
}
上述代码实现了不管输入多大的角度值(以弧度为单位),输出均落在[-pi,+pi]里。
static double
angle_diff(double a, double b)
{
double d1, d2;
a = normalize(a);
b = normalize(b);
d1 = a-b;
d2 = 2*M_PI - fabs(d1);
if(d1 > 0)
d2 *= -1.0;
if(fabs(d1) < fabs(d2))
return(d1);
else
return(d2);
}
上述代码返回a,b之间的夹角,并且返回值总是落在[-pi,+pi]里。总是取从a到b夹角小的那部分,如果从a到b为顺时针旋转返回正值,反之返回负值。
参考文章:
What is the difference between atan and atan2 in C++?
关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。