Atan2: примеры (JAVASCRIPT)

Использование atan2 в JavaScript для вычисления углов
Раздел: Математика, Тригонометрия
atan2(y, x): number

Описание функции Math.atan2()

Метод Math.atan2() возвращает арктангенс (угол в радианах) от частного своих аргументов. Этот метод учитывает знаки обоих параметров, что позволяет определить угол в правильном квадранте круга. Функция широко применяется в компьютерной графике, игровой разработке и геометрических расчетах для преобразования декартовых координат в полярные.

Синтаксис: Math.atan2(y, x)

  • y - координата по оси Y (значение типа number).
  • x - координата по оси X (значение типа number).

Возвращаемое значение: угол в радианах от -π до π (исключая -π) между положительной осью X и лучом из начала координат до точки (x, y). Особые случаи:

  • Если оба аргумента равны 0, возвращается 0.
  • Если x > 0, возвращается арктангенс y/x.
  • Если x < 0 и y ≥ 0, возвращается арктангенс y/x + π.
  • Если x < 0 и y < 0, возвращается арктангенс y/x - π.
  • Если x = 0 и y > 0, возвращается π/2.
  • Если x = 0 и y < 0, возвращается -π/2.

Простые примеры использования

Вычисление угла для точки в первом квадранте:

let angle = Math.atan2(1, 1);
console.log(angle); // в радианах
console.log(angle * 180 / Math.PI); // в градусах
0.7853981633974483
45

Обработка отрицательных координат:

console.log(Math.atan2(-1, -1));
console.log(Math.atan2(1, -1));
-2.356194490192345
2.356194490192345

Граничные значения на осях:

console.log(Math.atan2(5, 0)); // ось Y положительная
console.log(Math.atan2(-5, 0)); // ось Y отрицательная
console.log(Math.atan2(0, 0)); // начало координат
1.5707963267948966
-1.5707963267948966
0

Похожие функции в JavaScript

  • Math.atan() - вычисляет арктангенс одного числа (y/x), но не определяет квадрант. Используется когда известен тангенс угла без контекста координат.
  • Math.asin() и Math.acos() - возвращают арксинус и арккосинус соответственно. Применяются когда известны синус или косинус угла, но требуют ограничения входных значений диапазоном [-1, 1].
  • Math.atan2() предпочтительнее для преобразования координат, так как корректно обрабатывает все квадранты и частные случаи.

Аналоги в других языках программирования

Python: функция math.atan2(y, x) имеет аналогичное поведение, но всегда возвращает float.

import math
print(math.atan2(1, 1))
0.7853981633974483

PHP: atan2(y, x) принимает параметры в таком же порядке как JavaScript.

echo atan2(1, 1);
0.78539816339745

C/C++: atan2(y, x) из math.h работает идентично, но возвращает double. В некоторых реализациях есть перегрузки для float и long double.

#include 
printf("%f", atan2(1.0, 1.0));
0.785398

MySQL: ATAN2(y, x) или ATAN(y, x) возвращает значение арктангенса.

SELECT ATAN2(1, 1);
0.7853981633974483

Основное отличие в типах возвращаемых значений и обработке исключительных ситуаций, но семантика одинакова во всех языках.

Типичные ошибки при использовании

Перестановка аргументов местами - самая распространенная ошибка, так как порядок параметров (y, x) может быть неочевидным.

// Неправильно: перепутан порядок аргументов
console.log(Math.atan2(1, 2)); // Ожидается угол для точки (2, 1)
// Правильно:
console.log(Math.atan2(2, 1)); // Угол для точки (1, 2)
0.4636476090008061
1.1071487177940904

Ожидание градусов вместо радиан - функция всегда возвращает значение в радианах.

// Ошибка: использование результата как градусов
let angle = Math.atan2(1, 1);
console.log("Угол: " + angle + "°"); // Неправильно!
// Правильно: преобразование в градусы
let degrees = angle * 180 / Math.PI;
console.log("Угол: " + degrees + "°");
Угол: 0.7853981633974483°
Угол: 45°

Некорректная обработка особых случаев при x = 0.

// Неправильно: деление на ноль при самостоятельном вычислении
let y = 5, x = 0;
let wrongAngle = Math.atan(y / x); // Infinity или ошибка
// Правильно: использование atan2
let correctAngle = Math.atan2(y, x); // Возвращает π/2
Infinity
1.5707963267948966

Изменения в последних версиях

Функция Math.atan2() является частью стандарта ECMAScript 1 (1997 год) и с тех пор не претерпевала значительных изменений. В современных стандартах ECMAScript 2015 (ES6) и позднее поведение функции осталось неизменным. Единственное уточнение - в спецификации более явно описана обработка особых случаев и пограничных значений.

Все браузеры и среды выполнения JavaScript поддерживают эту функцию полностью совместимым образом с самого начала ее появления.

Расширенные примеры применения

Преобразование декартовых координат в полярные:

Пример javascript
function cartesianToPolar(x, y) {
    let radius = Math.sqrt(x * x + y * y);
    let angle = Math.atan2(y, x);
    return { radius, angle }; // угол в радианах
}

let point = cartesianToPolar(3, 4);
console.log("Радиус:", point.radius);
console.log("Угол (рад):", point.angle);
console.log("Угол (°):", point.angle * 180 / Math.PI);
Радиус: 5
Угол (рад): 0.9272952180016122
Угол (°): 53.13010235415598

Определение направления между двумя точками:

Пример javascript
function directionBetweenPoints(x1, y1, x2, y2) {
    let dx = x2 - x1;
    let dy = y2 - y1;
    return Math.atan2(dy, dx);
}

let direction = directionBetweenPoints(0, 0, -1, 1);
console.log("Направление (рад):", direction);
console.log("Направление (°):", direction * 180 / Math.PI);
Направление (рад): 2.356194490192345
Направление (°): 135

Нормализация угла к диапазону 0-2π:

Пример javascript
function normalizeAngle(angle) {
    // angle в радианах
    if (angle < 0) {
        angle += 2 * Math.PI;
    }
    return angle;
}

let angle1 = Math.atan2(-1, -1); // -135° или -3π/4
console.log("Исходный угол:", angle1);
console.log("Нормализованный:", normalizeAngle(angle1));
Исходный угол: -2.356194490192345
Нормализованный: 3.9269908169872414

Создание круговой диаграммы или распределения объектов по окружности:

Пример javascript
function pointsOnCircle(centerX, centerY, radius, count) {
    let points = [];
    for (let i = 0; i < count; i++) {
        let angle = (2 * Math.PI * i) / count;
        let x = centerX + radius * Math.cos(angle);
        let y = centerY + radius * Math.sin(angle);
        points.push({ x, y });
    }
    return points;
}

// Обратное преобразование: определение угла точки на окружности
let circlePoints = pointsOnCircle(0, 0, 5, 4);
circlePoints.forEach(point => {
    let calculatedAngle = Math.atan2(point.y, point.x);
    console.log(`Точка (${point.x}, ${point.y}) угол: ${calculatedAngle}`);
});
Точка (5, 0) угол: 0
Точка (3.061616997868383e-16, 5) угол: 1.5707963267948966
Точка (-5, 6.123233995736766e-16) угол: 3.141592653589793
Точка (-9.184850993605148e-16, -5) угол: -1.5707963267948966

JS atan2 function comments

En
Atan2 Returns the arctangent of the quotient of its arguments