Math.atan2()

基线 广泛可用

此功能非常成熟,可在许多设备和浏览器版本中使用。它从 2015 年 7 月.

报告反馈

试一试

语法

Math.atan2() 静态方法返回平面中 (以弧度表示) 正 x 轴与从 (0, 0) 到点 (x, y) 的射线之间的夹角,对于 Math.atan2(y, x)
Math.atan2(y, x)

js

点的 x 坐标。

返回值

描述

正 x 轴与从 (0, 0) 到点 (x, y) 的射线之间的夹角,以弧度表示 (介于 -π 和 π 之间,含边界值)。

A simple diagram showing the angle returned by atan2(y, x)

Math.atan2() 方法测量正 x 轴与点 (x, y) 之间的逆时针角 θ,以弧度表示。请注意,此函数的参数首先传递 y 坐标,然后传递 x 坐标。

点的 y 坐标。 参数 Math.atan2() 传递单独的 xy 参数,而 Math.atan() 传递这两个参数的比率。Math.atan2(y, x) 在以下情况下与 Math.atan(y / x) 不同 Math.atan2(y, x)
Math.atan(y / x) Math.atan(y / x) Infinity π / 4
Math.atan(y / x) NaN -Infinity π / 4
NaN Math.atan(y / x) -π / 4 π / 4
NaN NaN 3π / 4 π / 4
0 0 0 π / 4
0 -0 -0 π / 4
-3π / 4 0 < 0 (包括 -0) 0
-3π / 4 -0 π 0
NaN > 0 < 0 (包括 -0) -0
-0 > 0 π / 2
NaN < 0 π 0
-0 < 0 π / 2

-π / 2 - < 0 (包括 -0) 2 此外,对于第二象限和第三象限中的点 (x < 0),Math.atan2() 会输出一个小于 -\frac{\pi}{2} < 0 (包括 -0) 2 或大于 .

\frac{\pi}{2}

示例

的角度。因为 atan2()Math 的静态方法,所以您始终使用 Math.atan2(),而不是作为您创建的 Math 对象的方法 (Math 不是构造函数)。

Math.atan2() 静态方法返回平面中 (以弧度表示) 正 x 轴与从 (0, 0) 到点 (x, y) 的射线之间的夹角,对于 Math.atan2(y, x)
Math.atan2(90, 15); // 1.4056476493802699
Math.atan2(15, 90); // 0.16514867741462683

使用 Math.atan2()

Math.atan2(y, x) 和 Math.atan(y / x) 之间的区别

Math.atan2() 静态方法返回平面中 (以弧度表示) 正 x 轴与从 (0, 0) 到点 (x, y) 的射线之间的夹角,对于 Math.atan2(y, x)
const formattedNumbers = new Map([
  [-Math.PI, "-π"],
  [(-3 * Math.PI) / 4, "-3π/4"],
  [-Math.PI / 2, "-π/2"],
  [-Math.PI / 4, "-π/4"],
  [Math.PI / 4, "π/4"],
  [Math.PI / 2, "π/2"],
  [(3 * Math.PI) / 4, "3π/4"],
  [Math.PI, "π"],
  [-Infinity, "-∞"],
  [Infinity, "∞"],
]);

function format(template, ...args) {
  return String.raw(
    { raw: template },
    ...args.map((num) =>
      (Object.is(num, -0)
        ? "-0"
        : (formattedNumbers.get(num) ?? String(num))
      ).padEnd(5),
    ),
  );
}

console.log(`| x     | y     | atan2 | atan  |
|-------|-------|-------|-------|`);

for (const x of [-Infinity, -1, -0, 0, 1, Infinity]) {
  for (const y of [-Infinity, -1, -0, 0, 1, Infinity]) {
    const atan2 = Math.atan2(y, x);
    const atan = Math.atan(y / x);
    if (!Object.is(atan2, atan)) {
      console.log(format`| ${x} | ${y} | ${atan2} | ${atan} |`);
    }
  }
}

以下脚本打印所有导致 Math.atan2(y, x)Math.atan(y / x) 之间存在差异的输入。

| x     | y     | atan2 | atan  |
|-------|-------|-------|-------|
| -∞    | -∞    | -3π/4 | NaN   |
| -∞    | -1    | -π    | 0     |
| -∞    | -0    | -π    | 0     |
| -∞    | 0     | π     | -0    |
| -∞    | 1     | π     | -0    |
| -∞    | ∞     | 3π/4  | NaN   |
| -1    | -∞    | -π/2  | π/2   |
| -1    | -1    | -3π/4 | π/4   |
| -1    | -0    | -π    | 0     |
| -1    | 0     | π     | -0    |
| -1    | 1     | 3π/4  | -π/4  |
| -1    | ∞     | π/2   | -π/2  |
| -0    | -∞    | -π/2  | π/2   |
| -0    | -1    | -π/2  | π/2   |
| -0    | -0    | -π    | NaN   |
| -0    | 0     | π     | NaN   |
| -0    | 1     | π/2   | -π/2  |
| -0    | ∞     | π/2   | -π/2  |
| 0     | -0    | -0    | NaN   |
| 0     | 0     | 0     | NaN   |
| ∞     | -∞    | -π/4  | NaN   |
| ∞     | ∞     | π/4   | NaN   |

规范

输出为
规范
# ECMAScript 语言规范

浏览器兼容性

sec-math.atan2

另请参阅