std::atan2 în C++

Calculează unghiul punctului (x, y) față de axa orizontală, între -π și π, ținând cont de cadran.

Sintaxă
double atan2(double y, double x);

Ce face std::atan2

std::atan2(y, x) returnează unghiul pe care îl face vectorul de la origine la punctul (x, y). Spre deosebire de atan(y / x), folosește semnele ambelor coordonate, deci știe în ce cadran este punctul și funcționează și când x este 0.

Atenție la ordinea argumentelor: întâi y, apoi x. Rezultatul este în intervalul [-π, π].

Parametri

Parametru Descriere
y Coordonata verticală.
x Coordonata orizontală.

Ce returnează

Unghiul, în radiani, între -π și π.

Exemple

Exemplul 1: Patru puncte, patru cadrane

Cu atan(y / x), punctele (1, 1) și (-1, -1) ar avea același unghi.

#include <cmath>
#include <numbers>
#include <print>

int main() {
    double puncte[][2] = {{1, 1}, {-1, 1}, {-1, -1}, {1, -1}};

    for (auto& p : puncte) {
        double x = p[0];
        double y = p[1];
        std::println("({:>2}, {:>2}): atan2 = {:>7.2f}°, atan = {:>6.2f}°", x, y,
                     std::atan2(y, x) * 180 / std::numbers::pi, std::atan(y / x) * 180 / std::numbers::pi);
    }
}

Rezultat

( 1,  1): atan2 =   45.00°, atan =  45.00°
(-1,  1): atan2 =  135.00°, atan = -45.00°
(-1, -1): atan2 = -135.00°, atan =  45.00°
( 1, -1): atan2 =  -45.00°, atan = -45.00°

Exemplul 2: Direcția spre o țintă într-un joc

#include <cmath>
#include <numbers>
#include <print>

int main() {
    double jucator_x = 2, jucator_y = 3;
    double tinta_x = 2, tinta_y = 10;

    double unghi = std::atan2(tinta_y - jucator_y, tinta_x - jucator_x);
    std::println("Ținta este la {:.1f}° (drept în sus)", unghi * 180 / std::numbers::pi);
}

Rezultat

Ținta este la 90.0° (drept în sus)

Greșeli frecvente

  • Inversezi argumentele: atan2(x, y) în loc de atan2(y, x). Obții unghiul față de axa verticală.

Comenzi înrudite

  • std::asin: Funcțiile trigonometrice inverse: din valoarea sinusului, cosinusului sau tangentei obții unghiul, în radiani.
  • std::hypot: Calculează ipotenuza, adică √(x² + y²), fără depășiri la valori mari; din C++17 și în 3 dimensiuni.
  • std::sin: Funcțiile trigonometrice sinus, cosinus și tangentă; unghiul se dă în radiani, nu în grade.
  • std::complex: Numere complexe (a + bi), cu operațiile aritmetice obișnuite, modul, argument și funcții matematice.