в чем разница между 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
, за исключением случая, когда оба аргумента равны нулю.