c++之atan()与atan2()函数
作者:互联网
前言
在处理雷达数据的时候遇到了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