斜率计算:反正切函数 Math.atan() 与 Math.atan2() 的区别

我们可以使用正切Math.tan()操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将它转换为相应的角度。Math.atan()Math.atan2()两个函数可以计算反正切,接下来分析一下具体用法:

一、Math.atan()

Math.atan()接受一个参数:用法如下:

1
2
angel = Math.atan(slope)  //slope值计算为y/x (斜率比值无法判断 y、x方向,如-1/-1, 1/-1等情况)
//angel为一个角度的弧度值,`slope`为直线的斜率,是一个数字,这个数字可以是负的无穷大到正无穷大之间的任何一个值(tan的取值范围)

不过,利用它进行计算比较复杂。因为它的周期性,一个数字的反正切值不止一个。例如atan(-1)的值可能是45度,也可能是225度。这样就是它的周期性,对于正切函数来说,它的周期是180度,所以两个相差180度的角具有相同的正切和斜率:

1
tanθ=tan(θ+180)

然而,Math.atan()只能返回一个角度值,因此确定它的角度非常的复杂,而且,90度和270度的正切是无穷大,因为除数为零,我们也是比较难以处理的,因此我们更多的会采用第二个函数Math.atan2()进行处理。

二、Math.atan2()

Math.atan2()接受两个参数x和y,方法如下:

1
2
3
4
angel=Math.atan2(y,x) 

// x 指定点的 x 坐标的数字。
// y 指定点的 y 坐标的数字。

计算出来的结果angel是一个弧度值,也可以表示相对直角三角形对角的角,其中 x 是临边边长,而 y 是对边边长。

三、 对比Math.atan() 与 Math.atan2()输出测试

//输入弧度值,return 角度值
function trace(x){
  //弧度=角度*Math.PI/180
  return 180*x/Math.PI
}

测试如下:
①对比一
x=Math.atan(1)//计算正切值为1的数字对应的弧度值,输出弧度值0.785398163397448 (当斜率值为-7/-7或7/7)
trace(x) //输出45 

x=Math.atan2(7,7) //输出弧度值 0.785398163397448  

trace(x)   //输出45 

②对比二
x=Math.atan2(7,-7) //输出弧度值 2.35619449019234 
trace(x)   //转换为角度值 135  

x=Math.atan2(-7,7) //输出弧度值 -0.785398163397448
trace(x)  //转换为角度值输出-45

x=Math.atan2(-7,-7)   //输出弧度值 -2.35619449019234
trace(x)  //转换为角度值输出-135

从这些测试可以看出,通过坐标系的自动调整,可以很自由的计算出处于不同象限的位置相对应的角度.

四、 计算两点间连线的倾斜角

Math.atan2()函数返回点(x,y)和原点(0,0)之间直线的倾斜角,那么如何计算任意两点间直线的倾斜角呢?

其实只需要将两点x、y坐标分别相减得到一个新的点(x2-x1,y2-y1),然后利用它求出角度就可以了。使用下面的一个转换可以实现计算出两点间连线的夹角:

//输入弧度值,return 角度值
function trace(x){
  //弧度=角度*Math.PI/180
  return 180*x/Math.PI
}
var x = Math.atan2(y2-y1,x2-x1);  //得到弧度值
trace(x)  //获取角度值

具体实例例子:

//测试,计算点(3,3)和(5,5)构成的连线的夹角 
x=Math.atan2(5-3,5-3) //输出弧度值 0.785398163397448
trace(x)  //输出角度值 45

参考资料:
JavaScript atan() 方法
JavaScript atan2() 方法
角度与弧度的转换