2129. Полярный угол точки

 

Найдите полярный угол заданной точки.

 

Вход. Два целых числа – декартовы координаты точки, не совпадающей с началом координат. Модуль каждого из чисел не превышает 10000.

 

Выход. Выведите одно вещественное число – значение полярного угла данной точки в радианах из интервала [0; 2π). Ответ следует округлить до 6 десятичных знаков.

 

Пример входа

Пример выхода

2 3

0.982794

 

 

РЕШЕНИЕ

геометрия

 

Анализ алгоритма

Полярная система координат это двумерная система, в которой каждая точка плоскости однозначно задаётся двумя числами: полярным радиусом r и полярным углом φ (его также называют азимутом или фазовым углом).

Радиус r равен расстоянию от точки до центра, или полюса, системы координат. Угол φэто угол между полярной осью и лучом, соединяющим полюс с точкой; он отсчитывается против часовой стрелки от луча, соответствующего направлению (этот луч называют полярной осью).

                         

Пусть точка P имеет декартовы координаты (x, y) и полярные координаты (r, φ). Тогда формулы перехода от полярной системы координат к декартовой имеют вид:

Функция atan2(double y, double x) вычисляет значение арктангенса y/x и возвращает угол в интервале (-π; π]. Если x = 0, или оба аргумента равны нулю, функция возвращает 0.

В данной задаче полярный угол требуется вывести в интервале [0; 2π). Поэтому, если результат работы atan2 отрицателен, к нему следует прибавить .

 

Реализация алгоритма

Читаем входные данные.

 

scanf("%lf %lf",&a,&b);

 

Полярный угол точки вычисляем с помощью функции atan2.

 

res = atan2(b,a);

 

Если результат работы функции atan2 оказывается отрицательным, к полученному значению следует прибавить 2π, поскольку ответ должен лежать в интервале [0; 2π).

 

if (res < 0) res += 2*PI;

 

Выводим ответ.

 

printf("%.6lf\n",res);

 

Реализация алгоритма – класс

 

#include <stdio.h>

#include <math.h>

#define PI acos(-1.0)

 

class Point

{

private:

  double x, y;

public:

  Point(double x = 0, double y = 0) : x(x), y(y) {}

  void ReadPoint(void)

  {

    scanf("%lf %lf",&x,&y);

  }

  double GetPolarAngle()

  {

    double res = atan2(y,x);

    if (res < 0) res += 2*PI;

    return res;

  }

};

 

int main(void)

{

  Point p;

  p.ReadPoint();

  printf("%.6lf\n",p.GetPolarAngle());

  return 0;

}

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    double a = con.nextDouble();

    double b = con.nextDouble();

   

    double res = Math.atan2(b,a);

    if (res < 0) res += 2 * Math.PI;

    System.out.println(res);

    con.close();

  }

}  

 

Python реализация

Читаем входные данные.

 

import math

a, b = map(float,input().split())

 

Полярный угол точки вычисляем с помощью функции atan2.

 

res = math.atan2(b,a)

 

Если результат работы функции atan2 оказывается отрицательным, к полученному значению следует прибавить 2π, поскольку ответ должен лежать в интервале [0; 2π).

 

if (res < 0) :

  res += 2 * math.pi

 

Выводим ответ.

 

print("%.6f" %res)