平滑arctan的值,将值映射为0~2π


欢迎访问我的个人博客: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;
};


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM