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

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

Ответ 1

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

Ответ 2

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

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) сдерживает некоторую информацию и может только предположить, что вход поступает из квадрантов я или IV. Напротив, atan2(y,x) получает все данные и, следовательно, может разрешить правильный угол.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

Mehrwolf ниже правильно, но вот эвристика, которая может помочь:

Если вы работаете в двумерной системе координат, которая часто используется для программирования обратной касательной, вы должны использовать определенную функцию atan2. Он даст полный диапазон углов в 2 pi и позаботится о нулях в координате x для вас.

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

Ответ 10

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

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

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