Из школьной математики мы знаем, что касательная имеет определение
tan(α) = sin(α) / cos(α)
и мы различаем четыре квадранта в зависимости от угла, который мы предоставляем функциям. Знаки sin
, cos
и tan
имеют следующее соотношение (где мы пренебрегаем точными коэффициентами, кратными π/2
):
Quadrant Angle sin cos tan
-------------------------------------------------
I 0 < α < π/2 + + +
II π/2 < α < π + - -
III π < α < 3π/2 - - +
IV 3π/2 < α < 2π - + -
Учитывая, что значение tan(α)
положительное, мы не можем различить, был ли угол от первого или третьего квадранта, и если он отрицательный, он может исходить из второго или четвертого квадранта. Таким образом, по соглашению atan()
возвращает угол из первого или четвертого квадранта (т. Е. -π/2 <= atan() <= π/2
), независимо от исходного ввода в касательную.
Чтобы получить полную информацию, мы не должны использовать результат деления sin(α) / cos(α)
, но мы должны смотреть на значения синуса и косинуса отдельно. И это то, что делает atan2()
. Он принимает оба значения: sin(α)
и cos(α)
и разрешает все четыре квадранта, добавляя π
к результату atan()
всякий раз, когда косинус отрицательный.
Примечание: Функция atan2(y, x)
фактически принимает аргумент y
и x
, который является проекцией вектора с длиной v
и углом α
на y- и ось х, то есть
y = v * sin(α)
x = v * cos(α)
, что дает отношение
y/x = tan(α)
Вывод:
atan(y/x)
удерживает некоторую информацию и может только предполагать, что входные данные поступили из квадрантов I или IV. Напротив, atan2(y,x)
получает все данные и, следовательно, может разрешить правильный угол.