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); // Возвращает π/2Infinity 1.5707963267948966
Изменения в последних версиях
Функция Math.atan2() является частью стандарта ECMAScript 1 (1997 год) и с тех пор не претерпевала значительных изменений. В современных стандартах ECMAScript 2015 (ES6) и позднее поведение функции осталось неизменным. Единственное уточнение - в спецификации более явно описана обработка особых случаев и пограничных значений.
Все браузеры и среды выполнения 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
Определение направления между двумя точками:
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π:
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
Создание круговой диаграммы или распределения объектов по окружности:
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