Spec-Zone.ru › JavaScript

Math.atan2()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Статический метод Math.atan2() возвращает угол в плоскости (в радианах) между положительной осью x и лучом, идущим от (0, 0) к точке (x, y), для Math.atan2(y, x).

Попробуйте

function calcAngleDegrees(x, y) {
  return (Math.atan2(y, x) * 180) / Math.PI;
}

console.log(calcAngleDegrees(5, 5));
// Expected output: 45

console.log(calcAngleDegrees(10, 10));
// Expected output: 45

console.log(calcAngleDegrees(0, 10));
// Expected output: 90

Синтаксис

Math.atan2(y, x)

Параметры

y
Y-координата точки.
x
X-координата точки.

Возвращаемое значение

Угол в радианах (включительно от -π до π) между положительной осью x и лучом, идущим от (0, 0) к точке (x, y).

Описание

Метод Math.atan2() измеряет угол θ, против часовой стрелки, в радианах, между положительной осью x и точкой (x, y). Обратите внимание, что аргументы этой функции передают сначала Y-координату, а затем X-координату.

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

Math.atan2() передаются отдельные аргументы x и y, в то время как Math.atan() передается отношение этих двух аргументов. Math.atan2(y, x) отличается от Math.atan(y / x) в следующих случаях:

x y Math.atan2(y, x) Math.atan(y / x)
Infinity Infinity π / 4 NaN
Infinity -Infinity -π / 4 NaN
-Infinity Infinity 3π / 4 NaN
-Infinity -Infinity -3π / 4 NaN
0 0 0 NaN
0 -0 -0 NaN
< 0 (including -0) 0 π 0
< 0 (including -0) -0 -π 0
-Infinity > 0 π -0
-0 > 0 π / 2 -π / 2
-Infinity < 0 -π 0
-0 < 0 -π / 2 π / 2

Кроме того, для точек во втором и третьем квадрантах (x < 0), Math.atan2() выдавал бы угол, меньший -π2-\frac{\pi}{2} или больший π2\frac{\pi}{2}.

Поскольку atan2() является статическим методом Math, вы всегда используете его как Math.atan2(), а не как метод объекта Math, который вы создали (Math не является конструктором).

Примеры

Использование Math.atan2()

Math.atan2(90, 15); // 1.4056476493802699
Math.atan2(15, 90); // 0.16514867741462683

Разница между Math.atan2(y, x) и Math.atan(y / x)

Следующий скрипт выводит все входные данные, которые приводят к разнице между Math.atan2(y, x) и Math.atan(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} |`);
    }
  }
}

Вывод:

| 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® 2027 Language Specification
# sec-math.atan2

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
atan2
1
12
1
3
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

Смотрите также

  • Math.acos()
  • Math.asin()
  • Math.atan()
  • Math.cos()
  • Math.sin()
  • Math.tan()
  • CSS atan2() function

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API