前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++中atan()与atan2()的区别和用法

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

作者头像
用户7886150
修改2021-02-10 12:04:51
修改2021-02-10 12:04:51
3K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ 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++?

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档