2010-04-18 24 views
8

Tengo este fragmento de código, y me pregunto por qué los resultados del primer método se diferencian de los resultados del segundo método, dada la misma entrada?¿Ángulo entre dos vectores 2d, diferencia entre dos métodos?

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); 
} 

Respuesta

16

Es porque el primer método es correcto, mientras que el segundo método es incorrecto.

Puede notar que la función arcocoseno a veces se escribe "acos" y algunas veces se escribe "cos -1". Se trata de un capricho de la notación matemática: "cos -1" es realmente el arco coseno y no el inverso del coseno (que es la secante).

Sin embargo, si alguna vez ve "cos ", entonces ese es el cuadrado del coseno, y "cos " es el cubo del coseno. La notación para funciones trigonométricas es extraña de esta manera. La mayoría de los operadores usan superíndices para indicar aplicaciones repetidas.

+0

Fore seguro. ¡Gracias! Ha pasado un tiempo desde que tomé trigonometría en la escuela secundaria. – bitcycle

5

Math.Acos(divOperation) no es equivalente a 1/Math.Cos(divOperation). arccos es el de cos, no el inverso multiplicativo.

3

Probablemente porque acos (x) ≠ 1/cos (x).

Cuestiones relacionadas