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

平滑arctan的值,将值映射为0~2π的更多相关文章

  1. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  2. C++ 左值 右值

    最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 )   参考:<Boost程序库探秘——深度解析C ...

  3. java将map拼接成“参数=值&参数=值”

    Java将Map拼接成"参数=值&参数=值" 把一个map的键值对拼接成"参数=值&参数=值"即"username=angusbao& ...

  4. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  5. Jmeter的JDBC Request,sql参数化及返回值取值

    1.JDBC Request面板 Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字 ...

  6. 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注 ...

  7. C和C指针小记(八)-操作符、左值右值

    1.移位操作符 移位操作符分为左移操作符(<<)和右移操纵符(>>) 对于无符号数:左右位移操作都是逻辑位移 对于有符号数:到底是采用逻辑位移还是算术位移取决于编译器.如果一个 ...

  8. 关于布尔值bool值

    1.空或0布尔值为false,非0或非空为true 2.多个判断连在一起判断优先级:(括号)>not >and >or and:    print(27 and 1>4)  - ...

  9. 左值&右值

    一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在 ...

  10. CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

随机推荐

  1. Codeforces Round #781 (Div. 2) - D. GCD Guess

    GCD + 位运算 [Problem - 1665D - Codeforces](https://codeforces.com/problemset/problem/1627/D) 题意 交互题,有一 ...

  2. unity创建一个数组,让他随机生成一个东西之C#语言(有图教程)

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...

  3. 刚开始学python不知从何学习推荐你一本《Python零基础入门》书,免费领取

    百度云盘:Python零基础入门学习pdf高清版书籍下载 提取码:yzh3        

  4. Python生成whl文件

    下载源码包,生成whl文件 python setup.py bdist_wheel

  5. Operator包的应用

    # -*-coding:utf-8-*- import operator print(operator.add(1,1))    #  加 print(operator.sub(2,1))    #减 ...

  6. 【Java】dto转json

    <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac ...

  7. HttpClient请求接口实例demo

    HttpClient是Apache中的一个开源的项目.它实现了HTTP标准中Client端的所有功能,使用它能够很容易地进行HTTP信息的传输.HttpClient的主要功能: 实现了所有 HTTP ...

  8. python批量导出、安装依赖库文件

    导出: 在原环境中 pip freeze > fname.txt 安装: 在新环境中  pip install -r fname.txt 其中fname.txt 可以随意命名,其存储安装库文件列 ...

  9. NIO基本编写

    一.编写server端 1 public class Server implements Runnable{ 2 //1 多路复用器(管理所有的通道) 3 private Selector selet ...

  10. GAN的两种训练方式,以及梯度求导问题——detch(),retain_graph

    http://t.zoukankan.com/LXP-Never-p-13951578.html detach():截断node反向传播的梯度流,将某个node变成不需要梯度的Varibale,因此当 ...