c++中的atan和atan2有什么区别?
当前回答
Atan2 (y,x)通常用于将直角坐标转换为极坐标。它会给你角度,而根号(x*x+y*y)或者,如果有的话,hypot(y,x)会给你大小。
Atan (x)就是tan的逆。在烦人的情况下,你必须使用atan(y/x)因为你的系统不提供atan2,你必须做额外的检查x和y的符号,以及x=0,为了得到正确的角度。
注意:atan2(y,x)定义为y和x的所有实值,除非两个实参都为零。
其他回答
我猜主要的问题是试图弄清楚:“我应该什么时候使用一个或另一个”,或者“我应该使用哪个”,或者“我使用的是正确的”?
我想重要的一点是,atan只是为了在一个右向上的方向曲线上提供正的值,就像时间-距离向量一样。0总是在左下角,thigs只能向上或向右移动,只是速度变慢或变快。Atan不返回负数,所以你不能仅仅通过加/减结果在屏幕上的4个方向上跟踪事物。
Atan2的目的是让原点位于中间,并且可以向后或向下。这就是你在屏幕表示中使用的,因为你想让曲线走向什么方向确实很重要。atan2可以给出负数,因为它的0在中间,它的结果可以用来在4个方向上进行追踪。
atan(x)返回x的arctan的主值,用弧度表示。
atan2(y,x)返回y/x的arctan的主值,用弧度表示。
请注意,由于符号的模糊性,函数不能确定角度落在哪个象限,仅通过其正切值(atan)确定。如果需要确定象限,可以使用atan2。
使用atan2,您可以确定这里所述的象限。
如果需要,可以使用atan2 确定象限。
在atan2中,输出为:-pi < atan2(y,x) <pi 在atan中,输出是:-pi/2 < atan(y/x) < pi/2 //它不考虑四分之一。 如果你想要得到0到2*pi之间的方向(就像高中数学一样),我们需要使用atan2,对于负值,加上2*pi来得到0到2*pi之间的最终结果。 下面是Java源代码来解释清楚:
System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter
System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter
System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter
System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
实际值以弧度为单位,但用度来解释它们将是:
Atan =给出的角度值介于-90和90之间 Atan2 =给出的角度值在-180和180之间
在我的工作中,涉及到在导航中计算航向和方位等各种角度,atan2在大多数情况下可以完成这项工作。
推荐文章
- 如何构建和使用谷歌TensorFlow c++ api
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- gcc在哪里查找C和c++头文件?
- 为什么我们需要require require ?
- 解析c++中的命令行参数?
- 我如何在c++中创建一个随机的字母数字字符串?
- c++中的atan和atan2有什么区别?
- 现代c++能让你免费获得性能吗?
- 一门语言是如何自我扩展的?