Qual è la differenza tra atan e atan2 in C ++?


157

Qual è la differenza tra atane atan2in C ++?

Risposte:



322

Dalla matematica della scuola sappiamo che la tangente ha la definizione

tan(α) = sin(α) / cos(α)

e differenziamo tra quattro quadranti in base all'angolo che forniamo alle funzioni. Il segno di sin, cose tanhanno la seguente relazione (dove trascuriamo i multipli esatti di π/2):

  Quadrant    Angle              sin   cos   tan
-------------------------------------------------
  I           0    < α < π/2      +     +     +
  II          π/2  < α < π        +     -     -
  III         π    < α < 3π/2     -     -     +
  IV          3π/2 < α < 2π       -     +     -

Dato che il valore di tan(α)è positivo, non possiamo distinguere se l'angolo fosse dal primo o terzo quadrante e se fosse negativo, potrebbe provenire dal secondo o quarto quadrante. Quindi, per convenzione, atan()restituisce un angolo dal primo o quarto quadrante (cioè -π/2 <= atan() <= π/2), indipendentemente dall'input originale alla tangente.

Per recuperare le informazioni complete, non dobbiamo usare il risultato della divisione sin(α) / cos(α)ma dobbiamo esaminare i valori del seno e del coseno separatamente. E questo è ciò che atan2()fa. Prende entrambi, sin(α)e cos(α)e risolve tutti e quattro i quadranti aggiungendo πal risultato atan()ogni volta che il coseno è negativo.

Nota: la atan2(y, x)funzione prende effettivamente un ye un xargomento, che è la proiezione di un vettore con lunghezza ve angolo αsugli assi y e x, cioè

y = v * sin(α)
x = v * cos(α)

che dà la relazione

y/x = tan(α)

Conclusione: atan(y/x) vengono trattenute alcune informazioni e si può presumere che l'input provenga dai quadranti I o IV. Al contrario, atan2(y,x)ottiene tutti i dati e quindi può risolvere l'angolazione corretta.


3
Un piccolo dettaglio, l'intervallo -π/2 <= atan() <= π/2include in realtà un punto ( pi/2) dal quadrante II.
Bosone Z,

28

Un'altra cosa da menzionare è che atan2è più stabile quando si calcolano le tangenti usando un'espressione simile atan(y / x)ed xè 0 o vicino a 0.


Interessante, hai una fonte per questo? È vero in generale o solo per C ++?
Gerard,

26

I valori effettivi sono in radianti ma per interpretarli in gradi sarà:

  • atan = fornisce un valore dell'angolo compreso tra -90 e 90
  • atan2 = fornisce un valore dell'angolo compreso tra -180 e 180

Per il mio lavoro che prevede il calcolo di varie angolazioni come la direzione e il rilevamento nella navigazione, atan2nella maggior parte dei casi fa il lavoro.


12

atan (x) Restituisce il valore principale dell'arco tangente di x, espresso in radianti.

atan2 (y, x) Restituisce il valore principale dell'arco tangente di y / x, espresso in radianti.

Si noti che a causa dell'ambiguità del segno, una funzione non può determinare con certezza in quale quadrante l'angolo cade solo dal suo valore tangente (solo atan). Puoi usare atan2 se devi determinare il quadrante.


3
atan2 (x, y) -> atan2 (y, x)
yesraaj

L'intervallo di valori è principio (-pi,pi]ma atan2 ha la gamma [-pi,pi]in modo che include un valore aggiunto -pida un altro ramo a causa atan2(-0.0,x)di x<0.
Bosone Z,

4

Immagino che la domanda principale cerchi di capire: "quando dovrei usare l'uno o l'altro", o "quale dovrei usare" o "Sto usando quello giusto"?

Immagino che il punto importante sia che un solo scopo era quello di alimentare valori positivi in ​​una curva di direzione verso l'alto come per i vettori di distanza-tempo. Cero è sempre in basso a sinistra, e i colpi possono solo andare su e destra, solo più lentamente o più velocemente. atan non restituisce numeri negativi, quindi non puoi tracciare le cose nelle 4 direzioni su uno schermo semplicemente aggiungendo / sottraendo il suo risultato.

atan2 è inteso che l'origine sia nel mezzo e le cose possono andare indietro o in basso. Questo è quello che useresti in una rappresentazione dello schermo, perché è importante in quale direzione vuoi che vada la curva. Quindi atan2 può darti numeri negativi, perché il suo cero è al centro e il suo risultato è qualcosa che puoi usare per tracciare le cose in 4 direzioni.


2

Con atan2 è possibile determinare il quadrante come indicato qui .

Puoi usare atan2 se devi determinare il quadrante.


2

Considera un triangolo rettangolo. Etichettiamo l'ipotenusa r, il lato orizzontale y e il lato verticale x. L'angolo di interesse α è l'angolo tra xe r.

Il C ++ atan2(y, x)ci darà il valore dell'angolo α in radianti. atanviene utilizzato se conosciamo o siamo interessati solo a y / x e non a y e x singolarmente. Quindi se p = y / x allora per ottenere α dovremmo usare atan(p).

Non puoi usare atan2per determinare il quadrante, puoi usarlo atan2solo se sai già in quale quadrante sei dentro! In particolare, xey positivo implicano il primo quadrante, y positivo e x negativo, il secondo e così via. atano atan2se stessi restituiscono semplicemente un numero positivo o negativo, niente di più.


4
Se tutto ciò che hai è p=y/xè ancora possibile utilizzare atan2(p,1).
Mark Ransom,

0

Il mehrwolf di seguito è corretto, ma ecco un'euristica che può aiutare:

Se stai lavorando in un sistema di coordinate bidimensionale, che è spesso il caso della programmazione della tangente inversa, dovresti usare sicuramente atan2. Fornirà la gamma completa di 2 pi di angoli e prenderà cura degli zeri nella coordinata x per te.

Un altro modo di dire questo è che atan (y / x) è praticamente sempre sbagliato. Usa atan solo se l'argomento non può essere considerato come y / x.


0

atan2(y,x)viene generalmente utilizzato se si desidera convertire le coordinate cartesiane in coordinate polari. Ti darà l'angolo, mentre sqrt(x*x+y*y)o, se disponibile,hypot(y,x) ti darà la dimensione.

atan(x)è semplicemente l'inverso dell'abbronzatura. Nel fastidioso caso che devi usare atan(y/x)perché il tuo sistema non fornisce atan2, dovresti fare ulteriori controlli per i segni di xe y, e per x=0, al fine di ottenere l'angolazione corretta.

Nota: atan2(y,x) è definito per tutti i valori reali di ye x, ad eccezione del caso in cui entrambi gli argomenti sono zero.


0

Nel atan2, l'output è: -pi< atan2(y,x)< pi
e in Atan, l'output è: -pi/2< atan(y/x)< pi/2 // esso dose non prendere in considerazione il trimestre.
Se vuoi ottenere l'orientamento tra 0e 2*pi(come la matematica del liceo), dobbiamo usare atan2 e per valori negativi aggiungere il 2*piper ottenere il risultato finale tra 0e 2*pi.
Ecco il codice sorgente Java per spiegarlo chiaramente:

System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter

System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter

System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter

System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.