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

Работа с арктангенсом в PHP: функция atan2
Раздел: Математические функции
atan2(float $y, float $x): float

Описание функции atan2

Функция atan2 вычисляет арктангенс от двух переменных y и x. В отличие от atan, которая работает с одним аргументом, atan2 учитывает знаки обоих аргументов для определения корректного квадранта возвращаемого угла. Это позволяет получить угол в правильном диапазоне от -π до π.

Аргументы функции
  • y - делимое (ордината точки).
  • x - делитель (абсцисса точки).

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

Область применения

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

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

Различные комбинации знаков

Примеры показывают, как функция определяет квадрант.

echo atan2(1, 1);
0.78539816339745
echo atan2(1, -1);
2.3561944901923
echo atan2(-1, -1);
-2.3561944901923
echo atan2(-1, 1);
-0.78539816339745
Особые случаи

Работа с нулевыми значениями и границами осей.

echo atan2(0, 1); // Точка на положительной оси X
0
echo atan2(1, 0); // Точка на положительной оси Y
1.5707963267949

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

Функция atan вычисляет арктангенс одного аргумента (тангенс угла). Она возвращает значение в диапазоне от -π/2 до π/2. Применяется, когда известен только тангенс угла, а не отдельные координаты.

asin и acos

Функции asin (арксинус) и acos (арккосинус) также вычисляют углы, но по синусу или косинусу. Их использование предпочтительно, когда исходные данные представлены в виде этих тригонометрических функций.

Выбор функции

atan2 является предпочтительной при работе с декартовыми координатами, так как обеспечивает точное определение квадранта. Функции atan, asin, acos применяются в задачах, где угол нужно найти по значению его тригонометрической функции.

Функции в других языках

Atan2 в Python

В модуле math функция math.atan2(y, x) работает аналогично. Возвращает значение в радианах.

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

Atan2 в Javascript

Метод Math.atan2(y, x) обладает схожей семантикой.

console.log(Math.atan2(1, 1));
0.7853981633974483

Atan2 в MySQL

Функция ATAN2(y, x) или ATAN(y, x) возвращает арктангенс двух аргументов.

SELECT ATAN2(1, 1);
0.78539816339745
Отличия

Семантика и результат работы функций практически идентичны. Различия могут касаться обработки особых случаев (например, передача NULL), но в основном поведение согласовано.

Возможные ошибки

Неверный порядок аргументов

Перепутывание аргументов местами приводит к вычислению неправильного угла.

$x = 0;
$y = 5;
// Ошибка: сначала передается y, затем x.
echo atan2($x, $y); // Неверно
echo atan2($y, $x); // Верно
0
1.5707963267949
Передача нечисловых значений

До PHP 8 такие значения преобразовывались. В PHP 8 может возникнуть TypeError.

// PHP 7 и ниже
echo atan2('5', '5abc');
// PHP 8
try {
    echo atan2('5', '5abc');
} catch (TypeError $e) {
    echo $e->getMessage();
}
0.78539816339745
atan2(): Argument #2 ($x) must be of type int|float, string given
Ожидание градусов

Функция возвращает результат в радианах. Необходимо преобразование для получения градусов.

$rad = atan2(1, 1);
$degrees = rad2deg($rad);
echo $degrees;
45

Изменения в PHP 8

В PHP 8 функция atan2 стала строже относиться к типам аргументов. Передача нескалярных значений или строк, которые не могут быть преобразованы в число, вызывает исключение TypeError. Ранее такие аргументы преобразовывались в числа, что иногда приводило к неявным ошибкам. Сигнатура функции теперь явно указывает на типы int|float.

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

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

Функция является ключевой для нахождения угла (φ) в полярных координатах.

Пример php
function cartesianToPolar($x, $y) {
    $radius = hypot($x, $y);
    $angle = atan2($y, $x);
    return [$radius, $angle];
}
list($r, $phi) = cartesianToPolar(3, 4);
echo "Радиус: $r\n";
echo "Угол (рад): $phi\n";
echo "Угол (град): " . rad2deg($phi);
Радиус: 5
Угол (рад): 0.92729521800161
Угол (град): 53.130102354156
Определение наименьшего угла поворота

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

Пример php
function angleBetweenVectors($x1, $y1, $x2, $y2) {
    $dot = $x1*$x2 + $y1*$y2;
    $det = $x1*$y2 - $y1*$x2;
    return atan2($det, $dot);
}
$angle = angleBetweenVectors(1, 0, 0, 1);
echo rad2deg($angle);
90
Нормализация угла

Приведение угла к диапазону от 0 до 2π.

Пример php
function normalizeAngle($angle) {
    $twoPi = 2 * M_PI;
    $normalized = fmod($angle, $twoPi);
    if ($normalized < 0) {
        $normalized += $twoPi;
    }
    return $normalized;
}
$rawAngle = atan2(-1, -1); // -2.356...
echo rad2deg(normalizeAngle($rawAngle));
135
Определение направления по координатам

Использование в игровой логике для расчета направления движения объекта к цели.

Пример php
function getDirectionToTarget($objX, $objY, $targetX, $targetY) {
    $dx = $targetX - $objX;
    $dy = $targetY - $objY;
    return atan2($dy, $dx);
}
$direction = getDirectionToTarget(0, 0, 10, 10);
echo "Угол направления: " . rad2deg($direction) . " градусов";
Угол направления: 45 градусов

PHP atan2 function comments

En
Atan2 Arc tangent of two variables