首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中,atan和atan2有什么不同?

在C++中,atan和atan2有什么不同?
EN

Stack Overflow用户
提问于 2008-11-12 09:20:29
回答 11查看 182K关注 0票数 197

在C++中,atanatan2有什么不同?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2008-11-12 09:22:20

std::atan2允许计算所有四个象限的反差。std::atan仅允许从象限1和象限4进行计算。

票数 160
EN

Stack Overflow用户

发布于 2012-08-18 03:07:34

从学校数学我们知道切线有这样的定义

代码语言:javascript
复制
tan(α) = sin(α) / cos(α)

我们根据我们提供给函数的角度来区分四个象限。sincostan的符号具有以下关系(我们忽略π/2的精确倍数):

代码语言:javascript
复制
  Quadrant    Angle              sin   cos   tan
-------------------------------------------------
  I           0    < α < π/2      +     +     +
  II          π/2  < α < π        +     -     -
  III         π    < α < 3π/2     -     -     +
  IV          3π/2 < α < 2π       -     +     -

由于tan(α)的值是正的,我们无法区分角度是来自第一象限还是第三象限,如果它是负的,它可能来自第二象限或第四象限。因此,按照惯例,无论切线的原始输入是什么,atan()都会从第一个或第四个象限(即-π/2 <= atan() <= π/2)返回一个角度。

为了得到完整的信息,我们不能使用除法sin(α) / cos(α)的结果,而必须分别查看正弦和余弦的值。这就是atan2()所做的。它同时接受sin(α)cos(α),并通过在余弦为负时将π添加到atan()的结果中来解析所有四个象限。

备注: atan2(y, x)函数实际上接受一个y和一个x参数,这是一个长度为v、角度为α的向量在y轴和x轴上的投影,即

代码语言:javascript
复制
y = v * sin(α)
x = v * cos(α)

这给出了关系

代码语言:javascript
复制
y/x = tan(α)

结论: atan(y/x)保留了一些信息,只能假设输入来自象限I或象限IV。相比之下,atan2(y,x)获得了所有数据,因此可以解析正确的角度。

票数 365
EN

Stack Overflow用户

发布于 2014-05-15 07:32:08

实际值是以弧度表示的,但要用度来解释它们,它将是:

  • atan =提供介于-90和90
  • atan2之间的角度值=提供介于-180和180

之间的角度值

对于我的工作,涉及到各种角度的计算,如航向和航向,在大多数情况下,atan2可以完成这项工作。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/283406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档