В чем разница между atan и atan2 в C ++? - PullRequest
129 голосов
/ 12 ноября 2008

В чем разница между atan и atan2 в C ++?

Ответы [ 11 ]

274 голосов
/ 17 августа 2012

Из школьной математики мы знаем, что касательная имеет определение

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) получает все данные и, следовательно, может разрешить правильный угол.

106 голосов
/ 12 ноября 2008

std::atan2 позволяет вычислить арктангенс всех четырех квадрантов. std::atan позволяет рассчитывать только по квадрантам 1 и 4.

23 голосов
/ 12 ноября 2008

Следует также отметить, что atan2 является более стабильным при вычислении касательных с использованием таких выражений, как atan(y / x), а x равно 0 или близко к 0.

20 голосов
/ 15 мая 2014

Фактические значения приведены в радианах, но для интерпретации их в градусах это будет:

  • atan = дает значение угла между -90 и 90
  • atan2 = дает значение угла от -180 до 180

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

9 голосов
/ 12 ноября 2008

atan (x) Возвращает главное значение арктангенса x, выраженное в радианах.

atan2 (y, x) Возвращает главное значение арктангенса y / x, выраженное в радианах.

Обратите внимание, что из-за неоднозначности знака функция не может с уверенностью определить, в каком квадранте угол падает только по его значению касательной (только для atan). Вы можете использовать atan2, если вам нужно определить квадрант.

3 голосов
/ 09 февраля 2014

Я думаю, что главный вопрос пытается выяснить: «когда я должен использовать один или другой», или «который я должен использовать», или «я использую правильный»?

Полагаю, важным моментом было то, что атан был предназначен только для подачи положительных значений в кривой направления вправо-вверх, как для векторов времени-расстояния. Cero всегда находится внизу слева, и пальцы могут двигаться вверх и вправо, только медленнее или быстрее. atan не возвращает отрицательные числа, поэтому вы не можете отследить вещи в четырех направлениях на экране, просто сложив / вычтя его результат.

atan2 предназначен для того, чтобы источник находился посередине, и все может идти назад или вниз. Это то, что вы бы использовали в представлении на экране, потому что это НЕ имеет значения, в каком направлении вы хотите, чтобы кривая шла. Таким образом, atan2 может дать вам отрицательные числа, потому что его cero находится в центре, а его результат - это то, что вы можете использовать для отслеживания вещей в 4 направлениях.

2 голосов
/ 10 марта 2012

Рассмотрим прямоугольный треугольник. Мы помечаем гипотенузу r, горизонтальную сторону y и вертикальную сторону x. Угол интереса @ - это угол между x и r.

c ++ atan2 (y, x) даст нам значение угла @ в радианах. Атан используется, если мы знаем или заинтересованы только в y / x, а не в y и x по отдельности. Так что, если р = у / х затем, чтобы получить @, мы будем использовать atan (p).

Вы не можете использовать atan2 для определения квадранта, вы можете использовать atan2, только если вы уже знаете , который квадрант вашего входа! В частности, положительные x и y означают первый квадрант, положительный y и отрицательный x, второй и так далее. atan или atan2 сами просто возвращают положительное или отрицательное число, не более того.

2 голосов
/ 12 ноября 2008

С помощью atan2 вы можете определить сектор как указано здесь .

Вы можете использовать atan2, если вам нужно определить квадрант.

0 голосов
/ 22 июня 2018

В atan2 вывод: -pi <<code>atan2(y,x) <<code>pi
и в атане вывод: -pi/2 <<code>atan(y/x) <<code>pi/2 // он НЕ учитывает четверть.
Если вы хотите получить ориентацию между 0 и 2*pi (как в математике средней школы), нам нужно использовать atan2, а для отрицательных значений добавить 2*pi, чтобы получить окончательный результат между 0 и 2*pi.
Вот исходный код Java, чтобы объяснить это ясно:

System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter

System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter

System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter

System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
0 голосов
/ 05 марта 2017

atan2(y,x) обычно используется, если вы хотите преобразовать декартовы координаты в полярные координаты. Это даст вам угол, в то время как sqrt(x*x+y*y) или, если доступно, hypot(y,x) даст вам размер.

atan(x) - это просто инверсия загара. В досадном случае вы должны использовать atan(y/x), потому что ваша система не предоставляет atan2, вам нужно будет выполнить дополнительные проверки для знаков x и y и для x=0, чтобы получить правильный угол.

Примечание: atan2(y,x) определено для всех действительных значений y и x, за исключением случая, когда оба аргумента равны нулю.

...