C++中atan()与atan2()的区别和用法

区别

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 的符号。所以可以区分坐标点在哪个象限。

atan2参考

使用示例

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,机器人学等机器人行业常用技术资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值