A maneira para identificar ângulos apresentada a seguir será esquematizada em uma classe estática, podendo, dessa forma, identificar ângulos em um ambiente tanto 3D como em 2D. A classe estática será composta por 2 métodos estáticos: getAngulo e getNorma. Sendo o getNorma auxiliar do getAngulo. Assinatura do método: public static float getAngulo(Vector3 origem, Vector3 u, Vector3 v) { Um vetor é formado por dois pares ordenados: o ponto aonde ele começa (origem) e um outro ponto aonde ele termina (extremidade). u e v, passados no parâmentro, são as extremidades dos vetores que formam o ângulo entre eles. q é o ângulo formando entre os vetores. Observe o gráfico: 
Entenda um vetor como sendo as nossas flechas entre a “origem” e “u”, e também a “origem” e “v”. u = origem - u; v = origem - v; Efetuada a subtração, obtemos um novo Vetor com origem (0, 0) e extremidade obtida dessa subtração. Para se obter o resultado desejado, a subtração se faz necessária, pois a norma de u, por exemplo, é um vetor com origem (0, 0) e de extremidade u. Obs.: O ângulo “q” formado entre os 2 vetores antes da subtração, permanece o mesmo depois da operação. Para obter o ângulo “q” entre os dois vetores u e v, utilizaremos a fórmula a seguir: 
No numerador temos um produto escalar entre dois vetores, a resultante será um valor pertencente aos reais. No denominador temos o produto da norma(comprimento, intensidade ou módulo) de “u” com o produto da norma de “v”. Desde que nenhum dos vetores seja nulo, o valor obtido de “q” será 0 < q < pi Ao final encontraremos algo parecido com: cos(q) = x , aonde x será valor real delimitado no intervalo informado anteriormente. O nosso objetivo é encontrar um ângulo, então, utilizaremos um artifício matemático. Como cos(q) = x; é o mesmo dizer que q = arcocosseno (x) O valor obtido com o calculo do arcocosseno (x), retornará um valor(em Radianos) entre 0 < q < pi, agora só resta converter para Graus. //Produto escalar entre dois vetores, a resultante será //um valor pertencente aos reais. double produtoEscalar = (u.X * v.X) + (u.Y * v.Y) + (u.Z * v.Z); //aplicando a formula cos(q) = u * v / |v|*|u| //o resultado obtido estará em um intervalo entre 0 <= q <= pi double x = produtoEscalar / (getNorma(u) * getNorma(v)); //cos(q) = x, como o objetivo é achar o angulo q, temos que // q = arcocosseno(x), o valor obtido será em radianos double q = Math.Acos(x); //convertendo q(em radianos) para graus q = MathHelper.ToDegrees((float)q); //retorno do valor do angulo(em graus) formado entre os 2 vetores "u" e "v" return q; } Método Auxiliar Obtendo a Norma de um Vetor: O vetor em questão é do R³, logo temos |u| sendo:

O método para calcular a norma: /// /// Calcula a Norma, comprimento, intensidade ou módulo de um vetor /// /// Extremidade do vetor com Origem (0, 0, 0) /// Retorna a Norma do vetor; número real não negativo private static float getNorma(Vector3 u) { float norma = (float)Math.Sqrt((u.X * u.X) + (u.Y * u.Y) + (u.Z * u.Z)); return norma; } O produto final: angulo.cs 2524 bytes obs.: Lembrar de mudar o namespace... Aqui Finalizamos a classe estática. Agora ela é capaz de informar o ângulo, passando como parametro 3 vetores.
Utilizando a classe na prática: Fotos de alguns testes feitos: |