X|K

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  11 随笔 :: 0 文章 :: 0 评论 :: 11221 阅读

欢迎访问我的个人博客:xie-kang.com

原文地址

 

在某些场景计算夹角时,会期望带上象限信息。

此时atan函数将不再满足我们的使用要求,因为atan返回值为 -π/2 ~ π/2,它没有携带有象限信息。atan在1附近会发生符号翻转,有时候我们希望平滑处理1附近的值以达到我们所期望的效果。

 

 atan函数图像,来源于google。

 

atan2此时可以满足我们对其结果带上象限的期望。

atan2的实现逻辑:

 

 

 注:图片来源于google

 

使用图像可以直观体现为:

 

 

 使用atan2所携带的象限信息我们可以将atan2的结果映射到0~2π,:

1
2
3
4
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   X|K  阅读(1208)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示