Atan2: примеры (PHP)
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); // Точка на положительной оси X0
echo atan2(1, 0); // Точка на положительной оси Y1.5707963267949
Похожие функции в PHP
Функция atan вычисляет арктангенс одного аргумента (тангенс угла). Она возвращает значение в диапазоне от -π/2 до π/2. Применяется, когда известен только тангенс угла, а не отдельные координаты.
Функции 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.
Расширенные примеры применения
Функция является ключевой для нахождения угла (φ) в полярных координатах.
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
Вычисление минимального угла для поворота от одного вектора к другому.
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π.
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
Использование в игровой логике для расчета направления движения объекта к цели.
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 градусов