Calcular angulo entre dois pnotos

Não recomendo usar aquele jeito “ingênuo” que se aprende em trigonometria (calcular atan (y / x) ) porque você precisa nesse caso levar em conta uma série de casos especiais (ficar somando ou subtraindo pi radianos, etc.). Acho mais fácil usar atan2, que já leva em conta esses casos especiais.

Obrigado, vou dar uma olhada nessa documentação da atan2
qualquer duvida eu posto aqui de novo.

Eu olhei a função atan2, mas não entendi direito, o que eu queria fazer era só mostrar o angulo em relação ao eixo x e o eixo y, se alguem puder me mostrar o do eixo x o do y eu faço de boa.

Uma dica, precisa refatorar seu código, tem muita repetição e sua função main está muito extensa, crie novas classes e funções menores, vai diminuir a repetição de código, facilitando modificações e leitura, mesmo que seja apenas para testes manuais, vale a pena.

Tio, nem precisa entender muito para que serve o atan2. Basta saber que a conta que mostrei em Java é, em C:

double x = x2 - x1;  
double y = y2 - y1;  
double theta = atan2 (y, x); 

Não vi seu programa para saber como é que você pega os valores de x1, x2, y1 e y2 para passar para este trecho de código. Para passar o ângulo de radianos para graus, acho que você precisa só pegar aquele livro de matemática que está mofando na sua prateleira e ver como é que se faz a conta.

Além disso, você está com sérios problemas de matemática mesmo. Digamos que o ângulo theta que lhe passei seja 20 graus. O ângulo em relação ao eixo x é 20 graus e em relação ao eixo y - fala sério … -

P1(Ox, Oy) : primeiro ponto
P2(Ax, Ay) : segundo ponto

onde, explicitamente:
Ox : cordenada x do primeiro ponto
Oy : cordenada y do primeiro ponto
e
Ax : cordenada x do segundo ponto
Ay : cordenada y do segundo ponto

arco-tangente( (Ay-Oy) / (Ax- Ox) ) : angulo do eixo x ate a reta formada por P1 e P2.

arco-tangente( (Ax-Ox) / (Ay-Oy) ) : angulo do eixo y ate a reta formada por P1 e P2.

é a conta que o entanglement mostrou!

pra ajudar a entender os links



faça a conta primeiro e vai entender o porque.

De modo geral, duas ferramentas essenciais a qualquer pessoa que tente fazer algo que precise de um mínimo de geometria analítica (ou seja, gráficos e coordenadas):

a) Um livro de matemática que ensine um pouquinho de trigonometria

b) Lápis, papel e uma régua.

Pode também arranjar papel milimetrado e um transferidor, mas isso já é opcional. Agora, fazer tudo no teclado (e perguntar tudo aqui no Orkut, aham, no Facebook) já não funciona muito bem.

[quote=DavidUser]P1(Ox, Oy) : primeiro ponto
P2(Ax, Ay) : segundo ponto

onde, explicitamente:
Ox : cordenada x do primeiro ponto
Oy : cordenada y do primeiro ponto
e
Ax : cordenada x do segundo ponto
Ay : cordenada y do segundo ponto

arco-tangente( Ay-Oy / Ax- Ox ) : angulo do eixo x ate a reta formada por P1 e P2.

arco-tangente( Ax-Ox / Ay-Oy ) : angulo do eixo y ate a reta formada por P1 e P2.
[/quote]

Eu disse que é o método “ingênuo” que se ensina em livros de matemática.
Na prática, em vez de fazer a divisão diretamente (o que dá problemas quando você tem um ângulo de 90 ou 270 graus - isso porque o denominador se torna zero), e ter de ficar corrigindo os ângulos somando ou subtraindo 180 graus, você usa o atan2, que já leva esses casos em conta.

legal isso entanglement!

Eu já recomendei, e volto a recomendar novamente:
http://www.pontov.com.br/site/arquitetura/54-matematica-e-fisica/132-o-uso-de-vetores-nos-jogos

Se estivesse usando a biblioteca, só faria:

aproveitando o topico sobre angulos,
usando o Graphics2D e rotate() como faço para rodar a uma imagem sem tirar ela do seu eixo original?
quando uso:

[code]if (circle.contains(new Point(x2, y2))) {

        double x3 = x1- x2;
        double y3 = y2 - y1;

        double theta = Math.atan2(y3, x3);
        g.rotate(theta, x1, x2);
        g.drawImage(tower, x1, x2, this);

}[/code]

a imagem sai do eixo dela, queria apenas mudar o angulo da imagem em relação ao um ponto.

Grato.

Use metade do tamanho da imagem no segundo e terceiros parâmetros do método rotate.
Esses parâmetros indicam em que ponto da imagem será o pivot de rotação, considerando o canto superior esquerdo como 0,0.

[quote=ViniGodoy]Use metade do tamanho da imagem no segundo e terceiros parâmetros do método rotate.
Esses parâmetros indicam em que ponto da imagem será o pivot de rotação, considerando o canto superior esquerdo como 0,0.
[/quote]

A imagem tem 32x32 pixels, ainda esta saindo do centro…

    if (circle.contains(new Point(x2, y2))) {  
        
                double x3 = x1- x2;  
                double y3 = y2 - y1;  
      
                double theta = Math.atan2(y3, x3);  
                g.rotate(theta, 16, 16);  
                g.drawImage(tower, x1, x2, this);  
    }  

[quote=JJjava][quote=ViniGodoy]Use metade do tamanho da imagem no segundo e terceiros parâmetros do método rotate.
Esses parâmetros indicam em que ponto da imagem será o pivot de rotação, considerando o canto superior esquerdo como 0,0.
[/quote]

A imagem tem 32x32 pixels, ainda esta saindo do centro…

[code]
if (circle.contains(new Point(x2, y2))) {

            double x3 = x1- x2;  
            double y3 = y2 - y1;  
  
            double theta = Math.atan2(y3, x3);  
            g.rotate(theta, 16, 16);  
            g.drawImage(tower, x1, x2, this);  
}  

[/code][/quote]

tentei tb o codigo abaixo e ainda sai do eixo :frowning:

 if (circle.contains(new Point(x2, y2))) {  
        
                double x3 = x1- x2;  
                double y3 = y2 - y1;  
      
                double theta = Math.atan2(y3, x3);  
                g.rotate(theta, x1+16,x2+ 16);  
                g.drawImage(tower, x1, x2, this);  
    }  

A sua imagem está desenhada no centro?

Outra coisa, o centro do objeto desenhado dentro da imagem, é o mesmo centro da imagem? Caso contrário, você tem que ver qual é o pixel do centro e indicar esse valor.

[quote=ViniGodoy]A sua imagem está desenhada no centro?

Outra coisa, o centro do objeto desenhado dentro da imagem, é o mesmo centro da imagem? Caso contrário, você tem que ver qual é o pixel do centro e indicar esse valor.[/quote]

não está no centro tela esta na posição (400,300) por exemplo

Onde foi que falei em tela?

Perguntei se o centro do desenho e o centro do arquivo de imagem coincidem.

Você tem que saber qual é o pixel do pivo de rotação. Abra sua imagem no paint, veja em torno de que pixel a figura deveria girar e coloque o valor desse pixel nos dois últimos parâmetros do método rotate.

Onde foi que falei em tela?

Perguntei se o centro do desenho e o centro do arquivo de imagem coincidem.

Você tem que saber qual é o pixel do pivo de rotação. Abra sua imagem no paint, veja em torno de que pixel a figura deveria girar e coloque o valor desse pixel nos dois últimos parâmetros do método rotate.[/quote]

eu quero rodar no meio da imagem a imagem tem 32x32 pixels, o pixel do centro nao seria (16,16) ?

Poste sua imagem.