歡迎訪問我的個人博客: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;
};