Como calcular os pontos de um angulo?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
VictorMatuk
Debugger
[Avatar]

Membro desde: 30/06/2010 15:29:58
Mensagens: 69
Localização: Rio de Janeiro
Offline

Suponhamos que eu tenho um ponto e queria calcular o angulo dele em relação a outro
x1 = 0, y1 = 0
x2 = 10, y2 = 2
Como na imagem


Que fórmula usar?


Agora suponhamos que apareça outro ponto com o mesmo angulo em direção ao x1,y1. Como calcular o x e y desse ponto? x3, y3


La Salle na Veia.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 25216
Localização: Curitiba/PR
Offline

Primeiro de tudo. Pontos são a representação de locais no espaço. Portanto, não existe angulos entre pontos.
Você pode estar considerando o vetor formado pelo deslocamento do ponto em relação ao (0,0). Pelo seu desenho parece ser isso mesmo.

Nesse caso, o menor angulo entre dois vetores (pois existem 2 ângulos possíveis) é dado pelo arco-cosseno do produto escalar, dividido pelo produto do tamanho dos dois vetores.

angulo = arccos(a.b / ||a|||b||);
angulo = Math.acos(ax*bx+ay*by / sqr(ax*ax + ay*ay)*sqrt(bx*bx + by*by));


E para obter um ponto na mesma direção e sentido de um ponto qualquer, basta multiplicar x e y por um valor positivo qualquer. Se o valor for negativo, você obtém um ponto no sentido oposto.


Se você está tendo que fazer contas desse tipo, eu sugiro fortemente que você estude o conceito de vetores, e implemente uma classe que represente um vetor.

Para mais informações:
Ponto V! - O uso de vetores nos jogos

This message was edited 5 times. Last update was at 17/09/2010 14:58:55


@ViniGodoy - Lattes

Novo no fórum? Leia nosso How to.

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4306
Localização: Vargem Grande do Sul - SP
Offline

Não tenho tanto conhecimento de matemática quanto o Vinícius, mas já fiz algo assim:



Todo esse código pode ser melhorado e como já disse não tenho tanto conhecimento quanto o Vini.
Note que um dos pontos é sempre tratado como a "origem" do sistema de coordenadas para calcular o ângulo.
Não é a forma mais inteligente de se fazer, mas para o que você precisa (se é que eu entendi direito), vai ajudar.

Faltou falar, o retorno do ângulo é em grau.

[]´s
[Thumb - pontos.png]
 Nome do arquivo pontos.png [Disk] Download
 Descrição
 Tamanho 6 Kbytes
 Baixado:  67 vez(es)

This message was edited 1 time. Last update was at 17/09/2010 15:12:24




Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP. What Have You Tried? | The SSCCE

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm | Stack Overflow
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 25216
Localização: Curitiba/PR
Offline

Sim, sempre que falamos em ângulos, estamos falando em pelo menos dois segmentos de retas.

Dois segmentos de retas também tem sempre dois ângulos possíveis.
Um ângulo x, menor. E um angulo y, maior, que vale 360-x graus. É o ângulo complementar.


Eu realmente aconselho criar uma classe de vetores, ou usar a que eu já tenho no artigo, que postei para você.
Muitos calculos matemáticos ficam simplesmente triviais com ela.

@ViniGodoy - Lattes

Novo no fórum? Leia nosso How to.

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
VictorMatuk
Debugger
[Avatar]

Membro desde: 30/06/2010 15:29:58
Mensagens: 69
Localização: Rio de Janeiro
Offline

ViniGodoy wrote:Primeiro de tudo. Pontos são a representação de locais no espaço. Portanto, não existe angulos entre pontos.
Você pode estar considerando o vetor formado pelo deslocamento do ponto em relação ao (0,0). Pelo seu desenho parece ser isso mesmo.

Nesse caso, o menor angulo entre dois vetores (pois existem 2 ângulos possíveis) é dado pelo arco-cosseno do produto escalar, dividido pelo produto do tamanho dos dois vetores.

angulo = arccos(a.b / ||a|||b||);
angulo = Math.acos(ax*bx+ay*by / sqr(ax*ax + ay*ay)*sqrt(bx*bx + by*by));


E para obter um ponto na mesma direção e sentido de um ponto qualquer, basta multiplicar x e y por um valor positivo qualquer. Se o valor for negativo, você obtém um ponto no sentido oposto.


Se você está tendo que fazer contas desse tipo, eu sugiro fortemente que você estude o conceito de vetores, e implemente uma classe que represente um vetor.

Para mais informações:
Ponto V! - O uso de vetores nos jogos



Você disse aqui:
E para obter um ponto na mesma direção e sentido de um ponto qualquer, basta multiplicar x e y por um valor positivo qualquer. Se o valor for negativo, você obtém um ponto no sentido oposto.

Se eu tenho um ponto na posição x = 3000 e y = 3000. Se eu quiser adicionar um ponto a frente, é só eu multiplicar esses valores.

Se eu multiplicar isso ai por 1,1 eu recebo 3300 em x e 3300 em y.
Só que isso é um ponto muito longe do original.
Porem, se eu tivesse x,y = 10,10 e multiplicasse por 1,1 ia ter
x,y = 11,11
Esse ponto criado está de bom tamanho.
Vou ter que fazer uma funcao pra colocar um ponto numa distancia padrão então?

Quero que a distancia entre os pontos criados seja de 5.
Multiplicar por 1,1 nao ia funcionar se a coordenada fosse 3000 ou 10.

Alguma dica?


-------------- EDITADO --------------

Fiz algo assim

QTDAFRENTE = 5;
x = 3000
y = 286

x *= calculaPontoFixo(x) / 100;
y *= calculaPontoFixo(y) / 100;


calculaPontoFixo(ponto) {
resultado;
novoPonto = ponto + QTDAFRENTE;
resultado = novoPonto * 100 / ponto;
return resultado;
}


Consegui o que eu queria.

Eu queria colocar um ponto sempre a frente do outro de tantos em tantos pixels por exemplo, dai essa função funcionou no papel, agora vo pro java.


---------------- EDITADO EDITADO -------------------

¬¬
Na verdade eu to tentando descobrir pela porcentagem q eu tenho q multiplicar
Ou Seja essa função INUTIL QUE EU FIZ, no fim sempre me retorna o x + QTDAFRENTE

AIUAHIUAHIAUHAIU
[Thumb - Sem título.png]
 Nome do arquivo Sem título.png [Disk] Download
 Descrição
 Tamanho 7 Kbytes
 Baixado:  48 vez(es)

This message was edited 6 times. Last update was at 17/09/2010 18:13:28


La Salle na Veia.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 25216
Localização: Curitiba/PR
Offline

A dica que eu te dou é ler o artigo de vetores que eu te passei.

Para deixar numa distância de 5 de um vetor com outro, usando as classes que te passei, você varia assim:



Sem gambi.


Do jeito que você está fazendo, você está forçando o cálculo e olhando para o resultado final. Isso pode parecer dar certo, mas pode ser um desastre para novos conjuntos de valores de x e y, pois isso criará um vetor com nova inclinação.
O ideal é estudar um pouquinho da teoria de vetores, pois ela deixa trivial problemas desse tipo:

a) Achar pontos colineares (o que você está fazendo);
b) Calcular a trajetória entre dois pontos (direção e distância);
c) Calcular o ângulo entre dois vetores, ou entre o vetor e o eixo x;
d) Girar pontos;
e) Calcular posições relativas de objetos;

Vetores ainda podem ser aplicados com facilidade para modelar situações físicas (trajetória de bola, força de jatos), podem ser usados para testes de campo de visão, ou para fazer desenho mesmo.

This message was edited 1 time. Last update was at 18/09/2010 08:27:45


@ViniGodoy - Lattes

Novo no fórum? Leia nosso How to.

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team