2010-04-18 5 views
8

J'ai cet extrait de code, et je me demande pourquoi les résultats de la première méthode diffèrent des résultats de la deuxième méthode, donné la même entrée?Angle entre deux vecteurs 2d, diff entre deux méthodes?

public double AngleBetween_1(vector a, vector b) { 
    var dotProd = a.Dot(b); 
    var lenProd = a.Len*b.Len; 
    var divOperation = dotProd/lenProd; 
    return Math.Acos(divOperation) * (180.0/Math.PI); 
} 

public double AngleBetween_2(vector a, vector b) { 
    var dotProd = a.Dot(b); 
    var lenProd = a.Len*b.Len; 
    var divOperation = dotProd/lenProd; 
    return (1/Math.Cos(divOperation)) * (180.0/Math.PI); 
} 

Répondre

16

C'est parce que la première méthode est correcte, alors que la seconde méthode est incorrecte.

Vous remarquerez peut-être que la fonction arccosine est parfois écrite "acos" et parfois écrit "cos -1". C'est une bizarrerie de la notation mathématique: "cos -1" est vraiment l'arccosine et non l'inverse du cosinus (qui est la sécante).

Cependant, si vous voyez jamais « cos », alors c'est la place du cosinus et « cos » est le cube du cosinus. La notation pour les fonctions trigonométriques est bizarre de cette façon. La plupart des opérateurs utilisent des exposants pour indiquer une application répétée.

+0

Bien sûr. Merci! Cela fait un moment que j'ai pris trig au lycée. – bitcycle

5

Math.Acos(divOperation) n'est pas équivalent à 1/Math.Cos(divOperation). arccos est le de cos, pas l'inverse multiplicatif. Probablement parce acos (x) ≠ 1/cos (x)