ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Функции арктангенса atan и atan2 в C++

В предыдущем посте о связи прямоугольных и полярных координат в частности выведены формулы для перевода прямоугольных координат в полярные:

r = sqrt(x * x + y * y);
фи = atan(y / x);

Связь прямоугольных и полярных координат

Формула для вычисления угла фи выведена из геометрического определения тангенса угла

tan(фи) = y / x;

Изобразим график функции z = tan(фи), где z = y / x:

График функции z = tan(фи)

Вспомним, что график обратной функции (в нашем случае арктангенса по отношению к тангенсу) можно получить, повернув исходный график влево на 90 градусов и отразив полученное зеркально слева направо. Итак, график функции фи = atan(z):

График функции фи = atan(z)

Получилось, что в случае функции фи = atan(z) для одной и той же области определения (значения на оси z) существует множество областей значений (значения на оси фи).

Например, для графика, проходящего через начало координат (z = 0, фи = 0) область значений находится в пределах от –PI/2 до PI/2. Этот график обычно и обозначают формулой фи = atan(z), уточняя рядом с формулой область значений. Графики, лежащие выше и ниже этого графика, обозначают, прибавляя или отнимая от исходной формулы число Пи. Например, для нескольких графиков, лежащих ближе к началу координат:
...
фи = atan(z) + 2 * PI,  3*PI/2 < фи < 5*PI/2;
фи = atan(z) + PI,        PI/2 < фи < 3*PI/2;
фи = atan(z),            –PI/2 < фи < PI/2;
фи = atan(z) – PI,     –3*PI/2 < фи < –PI/2;
фи = atan(z) – 2 * PI, –5*PI/2 < фи < –3*PI/2;
...

Определенная в стандарте языка C++ функция для вычисления арктангенса atan является отображением графика фи = atan(z), проходящего через начало координат, то есть она возвращает значения в пределах от –PI/2 до PI/2.

Теперь вернемся к рисунку с полярными координатами в начале этого поста. И увидим, что, воспользовавшись стандартной функцией atan в языке C++ при попытке перевода прямоугольных координат в полярные, мы сможем получить угол фи только для 1-го и 4-го квадрантов системы координат (про квадранты я писал в посте о системах координат) из-за вышеописанного ограничения возвращаемых функцией atan значений пределами от –PI/2 до PI/2.

Что же делать? Воспользуемся кусочками других графиков арктангенса, о которых писалось выше. Вот как нужные кусочки графиков будут выглядеть на рисунке:

Кусочки графиков арктангенса

То есть для реализации этого в программе на C++ через стандартную функцию atan нужно будет описать нахождение угла фи с помощью следующих равенств:

(1 и 4 квадранты) если (x > 0), то фи = atan(y / x); красный график
(2 квадрант) если (x < 0 и y > 0), то фи = atan(y / x) + PI; зеленый
(3 квадрант) если (x < 0 и y < 0), то фи = atan(y / x) – PI; синий

Однако, вместо этого в программе на C++ можно использовать стандартную функцию нахождения арктангенса atan2, которая заменяет все вышеперечисленные равенства и выдает угол фи в нужных пределах от –PI до PI. То есть для перевода прямоугольных координат в полярные нужно использовать следующие формулы:

r = sqrt(x * x + y * y);
фи = atan2(y / x);


Если стандартная функция atan принимает один аргумент, то стандартная функция atan2 принимает два аргумента — прямоугольные координаты y и x (именно в таком порядке) и в зависимости от знаков каждого из аргументов выдает нужный график с нужным результатом:
radius = sqrt(x * x + y * y);
angle = atan2(y, x);

Подводящие к этому посты:
1. Мера измерения углов, радианы и градусы (тут).
2. Число Пи в программе на C++ (тут).
3. Прямоугольная и полярная системы координат (тут).
4. Связь прямоугольных и полярных координат (тут).
Tags: Математика, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments