平滑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