Nöqtənin Qütb Bucağı#2129

Nöqtənin Qütb Bucağı (Həll təhlili)

Qütb koordinat sistemi — bu ikitərəfli bir sistemdir ki, hər bir nöqtə iki ədədlə birmənalı şəkildə müəyyən edilir: qütb radiusu və qütb bucağı (bu həmçinin azimut və faza bucağı adlanır).

Radius nöqtənin mərkəzə, yəni koordinat sisteminin qütbü ilə arasındakı məsafəyə bərabərdir. Bucaq — qütb oxu ilə qütb nöqtəsini nöqtə ilə birləşdirən şüa arasındakı bucaqdır; bu istiqamətinə uyğun gələn şüadan əksər istiqamətdə ölçülür (bu şüa qütb oxu adlanır).

Göstərilir ki, nöqtə dekart koordinatları və qütb koordinatları ilə verilir. Belə məlum olur ki, qütb koordinat sistemindən dekart koordinat sisteminə keçiş aşağıdakı kimi olur:

\begin{cases} x = r \cos \varphi, \\ y = r \sin \varphi. \end{cases}

atan2(double , double ) funksiyası arktangentinin dəyərini hesablayır və bucağı (-\pi; \pi] intervalında qaytarır. Əgər x = 0 olursa, ya da hər iki arqument sıfıra bərabərdirsə, funksiya qaytarır.

Bu məsələdə qütb bucağı [0; 2\pi) intervalında çıxarılmalıdır. Buna görə, atan2 nəticəsi mənfi olarsa, ona əlavə olunmalıdır.

Alqoritmin realizasiyası

Giriş məlumatları oxuyuruq.

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

Nöqtənin qütb bucağını atan2 funksiyasının köməyi ilə hesablayırıq.

res = atan2(b,a);

Əgər atan2 funksiyasının nəticəsi mənfi çıxarsa, bu dəyərə əlavə etmək lazımdır, çünki cavab [0; 2\pi) intervalında olmalıdır.

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

Cavabı çıxarırıq.

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

Alqoritmin realizasiyası – sinif

#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 realizasiyası

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 realizasiyası

Giriş məlumatları oxuyuruq.

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

Nöqtənin qütb bucağını atan2 funksiyasının köməyi ilə hesablayırıq.

res = math.atan2(b,a)

Əgər atan2 funksiyasının nəticəsi mənfi çıxarsa, bu dəyərə əlavə etmək lazımdır, çünki cavab [0; 2\pi) intervalında olmalıdır.

if (res < 0) :
  res += 2 * math.pi

Cavabı çıxarırıq.

print("%.6f" %res)