X|K

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

posted on 2022-03-10 22:10  X|K  阅读(1419)  评论(0)    收藏  举报