atan2相关知识汇总

article/2025/5/15 20:27:22

1.atan2的含义

C 语言里 double atan2(double y,double x) 返回的是原点至点(x,y)的方位角,即与 x 轴的夹角。返回值的单位为弧度,取值范围为(-π, π]。结果为正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度。若要用度表示反正切值,请将结果再乘以 180/π。另外要注意的是,函数atan2(y,x)中参数的顺序是倒置的,atan2(y,x)计算的值相当于点(x,y)的角度值。


arctan2的图像表示(维基百科)


自己画的atan2的笛卡尔坐标系下的示意图,以及将atan2的范围转换到[0, 2π)的示意图。atan2转换到[0,2π)表示的是与x轴正方向的逆时针夹角,这样转换的好处是便于计算两条线之间的夹角。

参考博客:

https://baike.baidu.com/item/atan2/10931300?fr=aladdin

https://en.wikipedia.org/wiki/Atan2


2.atan2与atan的区别

atan接受的是一个正切值(直线的斜率)得到夹角,但是由于正切的规律性本可以有两个角度的但它却只返回一个,因为atan的值域是从-90~90 也就是它只处理一四象限,所以一般不用它。
atan2(double y,double x) 其中y代表已知点的Y坐标 同理x ,返回值是此点与远点连线与x轴正方向的夹角,这样它就可以处理四个象限的任意情况了,它的值域相应的也就是-180~180了。

例如:
例1:斜率是1的直线的夹角
cout<<atan(1.0)*180/PI;//45°
cout<<atan2(1.0,1.0)*180/PI;//45° 第一象限
cout<<atan2(-1.0,-1.0)*180/PI;//-135°第三象限
后两个斜率都是1 但是atan只能求出一个45°

例2:斜率是-1的直线的角度
cout<<atan(-1.0)*180/PI;//-45°
cout<<atan2(-1.0,1.0)*180/PI;//-45° y为负 在第四象限

cout<<atan2(1.0,-1.0)*180/PI;//135° x为负 在第二象限

常用的不是求过原点的直线的夹角 往往是求一个线段的夹角 这对于atan2就更是如鱼得水了
例如求A(1.0,1.0) B(3.0,3.0)这个线段AB与x轴正方向的夹角
用atan2表示为 atan2(y2-y1,x2-x1) 即 atan2(3.0-1.0,3.0-1.0)

它的原理就相当于把A点平移到原点B点相应变成B'(x2-x1,y2-y1)点

参考博客:https://www.cnblogs.com/dutlei/archive/2013/01/14/2860332.html


3.OpenCV中fastAtan2函数

fastAtan2函数在OpenCV中用户非常广,比如在SIFT描述子求取过程中需要计算特征点的方向,此时OpenCV的源码中就是使用的fastAtan2函数,fastAtan2函数原型如下:
float fastAtan2(float y,float x)
x—向量的x坐标
y—向量的y坐标
输入一个2维向量,计算这个向量的方向,以度为单位(范围是0度---360度),精度是0.3度。

static const float atan2_p1 = 0.9997878412794807f*(float)(180/CV_PI);
static const float atan2_p3 = -0.3258083974640975f*(float)(180/CV_PI);
static const float atan2_p5 = 0.1555786518463281f*(float)(180/CV_PI);
static const float atan2_p7 = -0.04432655554792128f*(float)(180/CV_PI);float fastAtan2( float y, float x )
{float ax = std::abs(x), ay = std::abs(y);float a, c, c2;if( ax >= ay ){c = ay/(ax + (float)DBL_EPSILON);c2 = c*c;a = (((atan2_p7*c2 + atan2_p5)*c2 + atan2_p3)*c2 + atan2_p1)*c;}else{c = ax/(ay + (float)DBL_EPSILON);c2 = c*c;a = 90.f - (((atan2_p7*c2 + atan2_p5)*c2 + atan2_p3)*c2 + atan2_p1)*c;}if( x < 0 )a = 180.f - a;if( y < 0 )a = 360.f - a;return a;
}

fastAtan2函数得出的角度是以X轴正方向为0°方向,然后角度确定按照逆时针方向,以360°为终点,角度范围0°- 360°。此函数用到的应该是一种快速计算atan2的方法,没有找到出处。但是看到另一种快速计算法:

float ax = std::abs(dx), ay = std::abs(dy);
float a = std::min(ax, ay)/(std::max(ax, ay)+(float)DBL_EPSILON);
float s = a*a;
float r = ((-0.0464964749 * s + 0.15931422) * s - 0.327622764) * s * a + a;
if(ay > ax) r = 1.57079637 - r;
if(dx < 0) r = 3.14159274f - r;
if(dy<0) r = -r;
//如果这一行改为:if(dy < 0) r = 6.28318548f - r;
//结果的取值范围变为[0, 2*PI]

参考博客:

https://blog.csdn.net/mingzhentanwo/article/details/45155307

https://blog.csdn.net/ubunfans/article/details/46680915?utm_source=itdadao&utm_medium=referral

4.fastAtan2与atan2的关系

#include<opencv2\opencv.hpp>using namespace std;
using namespace cv;int main()
{cv::Point P1(20, 30);	//第一象限点cv::Point P2(-45, 23);	//第二象限点cv::Point P3(-73, -38);	//第三象限点cv::Point P4(29, -47);	//第四象限点cout << "第一象限:P1" << P1 << endl;cout << "atan2: " << atan2(P1.y, P1.x) * 180 / CV_PI << endl;cout << "fastAtan2: " << fastAtan2(P1.y, P1.x) << endl;cout << "第二象限:P2" << P2 << endl;cout << "atan2: " << atan2(P2.y, P2.x) * 180 / CV_PI << endl;cout << "fastAtan2: " << fastAtan2(P2.y, P2.x) << endl;cout << "第三象限:P3" << P3 << endl;cout << "atan2: " << atan2(P3.y, P3.x) * 180 / CV_PI << endl;cout << "fastAtan2: " << fastAtan2(P3.y, P3.x) << endl;cout << "第四象限:P4" << P4 << endl;cout << "atan2: " << atan2(P4.y, P4.x) * 180 / CV_PI << endl;cout << "fastAtan2: " << fastAtan2(P4.y, P4.x) << endl;system("pause");return 0;
}

结果:


通过结果可以发现第一象限和第二象限,atan2(*180 / π)和fastAtan2的值基本相等,第三象限和第四象限,fastAtan2的值基本等于360 + atan2(*180 / π)。可以理解为,fastAtan2实现了将atan2的范围转换到[0, 360).



http://chatgpt.dhexx.cn/article/hPuTBOWo.shtml

相关文章

HPC超算初识思维导图

HPC是高性能计算(High Performance Computing)机群的简称。指能够执行一般个人电脑无法处理的大资料量与高速运算的电脑&#xff0c;其基本组成组件与个人电脑的概念无太大差异&#xff0c;但规格与性能则强大许多。现有的超级计算机运算速度大都可以达到每秒一兆&#xff08;万…

超级计算机中心建设方案,超算中心建设框架

数据中心硬件建设框架 1.主要内容 华浩超算数据中心主要由基础硬件设施、超算影像处理系统及业务协同管理应用平台和安全保密体系组成。每个部分相互联系、相互依赖。目前具体建设内容如下&#xff1a; 内容一&#xff1a;基础硬件设施建设 1&#xff1a;机房及服务器集群建设 …

HPC超算网络资源

HPC超算资源 资源 Blue Water 超算William D. GroppOSU benchmarksTuning MPI Applications for Peak Performance W.D.Gropp苏黎世联邦理工 Scalable Parallel Computing LaboratoryNERSC超算文档资料HPC Wikipipeline-parallelism 课程 Design of Parallel and High-Perfor…

word文档中英文行间距不一样怎么解决

方法/步骤1: 在编辑文档时发现在有英文的段落中&#xff0c;行间距与没有要英文的不同&#xff0c;如图&#xff1a; 方法/步骤2: 该如何解决呢&#xff1f;首先鼠标选中有英文的段落&#xff0c;或者CTRLA全选&#xff1a; 方法/步骤3: 然后选中功能选项卡的开始选项卡&…

word文档中设置的行距一样但实际显示的不一样

最近发现了一个很奇怪的问题&#xff0c;思考了好久好久&#xff0c;找不到原因&#xff0c;果然还是对于office不够了解呀。 问题缘由 word2013中&#xff0c;同样一段文字&#xff0c;字体字号行间距都设置了相同的&#xff0c;但是为什么看起来行间距好像不一样&#xff1…

【word】复制到word的文字不能调整行间距(行间距过大)

问题&#xff1a; 复制到word的文字不能调整行间距&#xff08;行间距过大&#xff09; 原因&#xff1a; 行距和文档网格冲突了。行距是为了控制行距而存在的&#xff0c;文档网格是为了控制每页的行数而存在的。 解决方法是&#xff1a;在“段落”设置里把“对齐到文档网格“…

word行中公式和文字对不齐解决办法

1、段落——中文版式——文本对齐方式&#xff08;居中和自动都试试&#xff09;&#xff08;大部分都能解决&#xff09; 优点&#xff1a;大批量解决对不齐文本 2、双击对不齐的公式打开mathtype——格式&#xff08;M&#xff09;——内联公式&#xff08;I&#xff09;选中…

docx行间距怎么设置_word怎么调整行间距的两种方法

我们在使用word时&#xff0c;由于各种原因我们需要设置行间距&#xff0c;可是word行间距怎么调?word行距怎么设置呢?那么下面就由学习啦小编给大家分享下word调整行间距的技巧&#xff0c;希望能帮助到您。 word调整行间距方法一&#xff1a; 步骤一&#xff1a;首先打开你…

Mathtype与word的格式问题

插入mathtype公式后&#xff0c;word的行间距变大问题。 插入公式后&#xff0c;行间距变大 解决方法&#xff1a; 第一步&#xff1a;在“页面设置” 页面设置的位置 第二步&#xff1a;“行间距“。选择自己文档的行间距。我这里设置的是20磅。 第三步&#xff1a;打开“段落…

css解决文本间距不一样的问题

不知道大家有没有遇到跟小编一样的问题&#xff0c;获取文本之后&#xff0c;文本间距居然出现大小间距&#xff0c;类似下面这种 excuse me&#xff1f;&#xff1f;什么鬼&#xff0c;明明什么样式都没有给&#xff0c;间距那么大是什么情况&#xff1f;&#xff1f;抓狂&am…

WORD、WPS中插入公式后行距变大怎么办

我们在word中使用公式编辑器编辑后公式后&#xff0c;发现行距变大了怎么调整啦&#xff0c;这里总结了两个方法&#xff0c;能够解决行距不一致的问题&#xff0c;可以在行距没有严格要求的情况下使用。 可以看出&#xff0c;在插入公式的行的间距变大&#xff0c;怎么解决啦…

word插入MathType公式行距变大调整办法

背景&#xff1a;当使用word写文章时&#xff0c;不可避免地需要在文中插入公式&#xff0c;我这里使用的工具是MathType。 问题&#xff1a;但插入段落内公式时&#xff0c;行间距变大&#xff0c;会变得和其他地方不一样&#xff0c;非常的不美观&#xff0c;如下图所示。如何…

word 文档标题样式相同、行距效果不同的解决办法

先看下图示例&#xff0c;两个标题均采用了标题1的样式&#xff08;段前、段后0.5行&#xff0c;单倍行距&#xff09;&#xff0c;但展现出的效果有很大差异。 修改办法&#xff1a;将鼠标放置在需要修改的标题页&#xff0c;菜单栏点击【布局】 --->点击【页面设置】右下角…

解决word中公式插入后行间距变大,和文字不统一的问题

如果你正在使用Mathtype编辑公式&#xff0c;插入公式后可能得到这样的效果&#xff1a; 插入公式的地方行间距明显变大&#xff0c;如果你按照其他博客的方法&#xff0c;在段落中取消勾选“如果定义了文档网格&#xff0c;则对齐到网格” 那么得到的效果是这样的&#xff1…

word-解决复制相同的word内容,显示行间距差别大的原因

有时候我们参考别人格式写文章的时候&#xff0c;明明是保留格式直接复制过来的&#xff0c;结果和原来是word的页数不一样&#xff0c;这是因为我们&#xff0c;定义保留了网络文档。 那怎么解决呢 只要复制过来把这个钩去掉即可 当然你要是想修改&#xff0c;直接在页面布局…

【Word学习笔记】排版——行内公式间距不一致调整方法

目录 前言问题描述解决办法取消对齐网线线设置固定行间距 需要注意的点——公式显示不完整解决途径 总结 前言 这是本人在使用Word过程中的一些笔记&#xff0c;可能许多不足之处&#xff0c;欢迎批评指正。 问题描述 当我们用公式编辑器(比如mathtype、Axmath)在段落中输入行…

Mathtype中使用inline导致word行间距不一致的问题解决方案

Mathtype中使用inline导致word行间距不一致的问题解决方案 前言解决方案 前言 在论文写作中遇到的一个小问题&#xff0c;即在word2013中&#xff0c;向正文文字插入mathtype的inline会导致行间距不一致。 解决方案 1、字体>字符间距>位置&#xff0c;选为标准 2、段落…