Artigo
Angulo entre Vetores com XNA
Construa uma classe reusável para obtenção de ângulos
Enviado por Luciano José em 10/12/2007 22:09:49

 

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 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:

 

 

 

Projeto utilizado para o teste do triangulo:  angulo-triangulo.zip 62078 bytes

Projeto utilizado para o teste do Pentagono: angulo-pentagono.zip 63635 bytes


Aceito dúvidas e sugestões.

Obrigado! 

 


Sobre o Autor

lucianoJose
Luciano José
@lucianoJoseBr My Blog: http://lucjose.wordpress.com

Clique para avaliar:

Comentários
" aew Obrigado!!!"
Enviado por lucianoJose em 3/1/2008 5:24:25:
 
" Great! Congratulations!"
Enviado por leo em 13/12/2007 17:41:55:
 
" Muito bom... meus parabéns!!! "
Enviado por Nilo em 11/12/2007 6:52:40:
 

Adicione seu Comentário  Voltar
Translator
Logos do XBox 360, XNA e Games For Windows
Copyright 2006-2012 por SharpgamesPolítica de Privacidade  |  Termos de Uso