欢迎访问我的个人博客:xie-kang.com
在某些场景计算夹角时,会期望带上象限信息。
此时atan函数将不再满足我们的使用要求,因为atan返回值为 -π/2 ~ π/2,它没有携带有象限信息。atan在1附近会发生符号翻转,有时候我们希望平滑处理1附近的值以达到我们所期望的效果。
atan函数图像,来源于google。
atan2此时可以满足我们对其结果带上象限的期望。
atan2的实现逻辑:
注:图片来源于google
使用图像可以直观体现为:
使用atan2所携带的象限信息我们可以将atan2的结果映射到0~2π,:
float mapAtan2(float x, float y) { float t = std::atan2(y, x); return t < 0 ? 2 * 3.1415926 + t : t; };
该过程可以直观体现为:
以下是在工程中碰到的实际问题,我们在处理路径上的文本的绘制时,使用了atan来计算路径上的点的法线的夹角,当法线夹角接近y轴时会发生符号翻转,所以出现了绘制出了下图错误的图像,其中的文本没有严格在线条的右侧。
在经过使用atan2且加上映射处理后得到的正确结果:
automapAtan2=[](floatx,floaty)->float{
floatt=std::atan2(y,x);
returnt<0?2*M_PI+t:t;
};