ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++之atan()与atan2()函数

2020-01-21 20:01:38  阅读:587  来源: 互联网

标签:std atan point double c++ atan2 180 PI


前言

在处理雷达数据的时候遇到了atan2函数的使用, 具体是根据point点的x, y, z坐标, 求出该点在点云中的序号, 即行列号.

double vertical_angle = std::atan2(point.z, std::sqrt(point.x * point.x + point.y * point.y)) * 180 / M_PI;

float horizon_angle = std::atan2(point.y, point.x) * 180 / M_PI;
int col_index = std::round((horizon_angle / 0.2)) + cloud_width / 2;

公式很好理解, 但是在求取col_index时加上了cloud_width/2, col_index起始点在x轴反向上, 即-180°. 逆时针.

atan2()函数

double atan2 (double y     , double x);
float atan2 (float y      , float x);

返回值的范围是[-pi, +pi].

  • 其他

如果想从x轴正向作为起点, 即0°, 那么需要将atan的范围从[-PI, PI]改到[0, 2 * PI]:

double myAtan2(const double y, const double x)
{
  if (y == 0)
  {
    if (x >= 0)
    {
      return 0.0;
    }
    else
    {
      return M_PI;
    }    
  }
  else if (y < 0)
  {
    return (std::atan2(y, x) + 2 * M_PI);
  }
  else
  {
    return std::atan2(y, x);
  }
}

atan与atan2区别

在C语言的math.h或C++中的cmath中有两个求反正切的函数atan(double x)atan2(double y,double x) 他们返回的值是弧度。

前者接受的是一个正切值(直线的斜率)得到夹角,但是由于正切的规律性本可以有两个角度的但它却只返回一个,因为atan的值域是从-90~90 也就是它只处理一四象限,所以一般不用它。

第二个atan2(double y,double x) 其中y代表已知点的Y坐标 同理x ,返回值是此点与远点连线与x轴正方向的夹角,这样它就可以处理四个象限的任意情况了,它的值域相应的也就是-180~180了

Chris_lzy 发布了3 篇原创文章 · 获赞 2 · 访问量 710 私信 关注

标签:std,atan,point,double,c++,atan2,180,PI
来源: https://blog.csdn.net/woaizhiyang/article/details/104065255

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有