Translate e rotate em tempo de excução em java Graphics2D

3 respostas Resolvido
java
SG_Silvio

Olá amigos, estou com um problema em java usando Graphics2D
Quero fazer uma animação em que as as duas rodas da bicicleta faça Rotate e ao mesmo tempo que as
rodas e a bicicleta como todo se desloca no eixo X (Translate(x, 0))

Podem me ajudar a resolve-lo?

import java.awt.<em>;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.geom.</em>;

import java.lang.<em>;

import javax.swing.</em>;

public class TesteA extends JPanel {

//variaveis globais
private int numeroDeQuadro;
private long tempoPassado;
private float tamanhoPixel;

public static void main(String[] args) {
    JFrame janela = new JFrame("Projeto Java - Flavio & Silvino");
    final TesteA panel = new TesteA();
    janela.setContentPane(panel);
    janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    janela.pack();

    Dimension ecra = Toolkit.getDefaultToolkit().getScreenSize();//tamanho da janela

    janela.setLocation((ecra.width - janela.getWidth()) / 2,
            (ecra.height - janela.getHeight()) / 2 - 30);//centrar janela

    janela.setVisible(true);
    //panel.requestFocusInWindow();
    janela.setResizable(true);

    //animar os objetos
    final long tempoInicio = System.currentTimeMillis();
    Timer tempoAnimacao = new Timer(16,
            new ActionListener() {
        public void actionPerformed(ActionEvent arg) {
            panel.numeroDeQuadro++;
            panel.tempoPassado = System.currentTimeMillis() - tempoInicio;

            panel.repaint(); //redesenhar os objetos na janela
        }
    });

    tempoAnimacao.start();

}

// construtor
public TesteA() {
    setPreferredSize(new Dimension(1300, 650));
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g.create();

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    g2.setPaint(Color.darkGray);
    g2.fillRect(0, 0, getWidth(), getHeight());
    
    aplicarTransformacaoWindowToViewport(g2, 0, getWidth(), getHeight(), 0, true);
    
    
    //ANIMAÇÃO

                 
    //Raio da roda de traz    
    Path2D raios = new Path2D.Double();
    g2.translate(3, 0);
    g2.rotate(numeroDeQuadro * 0.05, 125, 545);//fazer girar a figura  
    g2.translate(-3, 0);

    g2.setStroke(new BasicStroke(2 * tamanhoPixel));
    g2.setPaint(Color.WHITE);

    //double angulo = (2*Math.PI/4);
    raios.moveTo(125, 545);
    raios.lineTo(125, 525);
    raios.moveTo(125, 545);
    raios.lineTo(125, 565);
    raios.moveTo(125, 545);
    raios.lineTo(105, 545);
    raios.moveTo(125, 545);
    raios.lineTo(145, 545);
    raios.moveTo(125, 545);
    raios.lineTo(112.5, 530);
    raios.moveTo(125, 545);
    raios.lineTo(112.5, 560);
    raios.moveTo(125, 545);
    raios.lineTo(138.5, 560);
    raios.moveTo(125, 545);
    raios.lineTo(138.5, 530);
    g2.draw(raios);

    
    //Raio da roda de frente
    Path2D raios2 = new Path2D.Double();
    g2.translate(3, 0);
    g2.rotate(numeroDeQuadro * 0.05, 225, 545);//fazer girar a figura       
    g2.translate(-3, 0);
    // g2.translate(50, 0);
    g2.setStroke(new BasicStroke(2 * tamanhoPixel));
    g2.setPaint(Color.WHITE);

    
    raios2.moveTo(225, 545);
    raios2.lineTo(225, 525);
    raios2.moveTo(225, 545);
    raios2.lineTo(225, 565);
    raios2.moveTo(225, 545);
    raios2.lineTo(205, 545);
    raios2.moveTo(225, 545);
    raios2.lineTo(245, 545);
    raios2.moveTo(225, 545);
    raios2.lineTo(212.5, 530);
    raios2.moveTo(225, 545);
    raios2.lineTo(212.5, 560);
    raios2.moveTo(225, 545);
    raios2.lineTo(238.5, 560);
    raios2.moveTo(225, 545);
    raios2.lineTo(238.5, 530);
    g2.draw(raios2);
    

    g2.setPaint(new Color(255, 235, 0));//rodas
    g2.setStroke(new BasicStroke(8));
    g2.drawOval(100, 520, 50, 50);//traseira
    g2.drawOval(205, 527, 40, 40);//frente

    Path2D.Double q4 = new Path2D.Double();// pidal
    g2.setPaint(new Color(0, 0, 0));
    q4.moveTo(175, 552);
    q4.lineTo(175, 537);
    g2.setStroke(new BasicStroke(4));
    g2.draw(q4);

    Path2D.Double q = new Path2D.Double();//quadro
    g2.setPaint(new Color(60, 255, 25));
    q.moveTo(125, 545);
    q.lineTo(160, 500);
    q.lineTo(170, 550);
    q.closePath();
    q.moveTo(170, 550);
    q.lineTo(210, 500);
    q.lineTo(160, 500);
    q.moveTo(160, 500);
    q.lineTo(160, 485);
    q.moveTo(210, 500);
    q.lineTo(225, 545);
    q.moveTo(210, 500);
    q.lineTo(210, 485);
    g2.setStroke(new BasicStroke(4));
    g2.draw(q);

    Path2D.Double q1 = new Path2D.Double();//volante
    g2.setPaint(new Color(255, 235, 0));
    q1.moveTo(220, 475);
    q1.lineTo(200, 490);
    g2.setStroke(new BasicStroke(7));
    g2.draw(q1);

    Path2D.Double q2 = new Path2D.Double();//cilim
    g2.setPaint(new Color(255, 235, 0));
    q2.moveTo(155, 485);
    q2.lineTo(165, 485);
    g2.setStroke(new BasicStroke(10));
    g2.draw(q2);

    g2.setColor(Color.lightGray);
    g2.fillOval(165, 540, 20, 20);//pedal

    Path2D.Double q3 = new Path2D.Double();//cilim
    g2.setPaint(new Color(0, 0, 0));
    q3.moveTo(175, 552);
    q3.lineTo(175, 565);
    g2.setStroke(new BasicStroke(4));
    g2.draw(q3);

    
}

private void aplicarTransformacaoWindowToViewport(Graphics2D grafico2d, double esquerda, double direita, double inferior, double superior, boolean preservarAspecto) {

    int largura = getWidth();  // Largura da area de desenho, em píxeis.
    int altura = getHeight();  // Altura da área de desenho, em píxeis.

    if (preservarAspecto) {
        // Ajustar os limites para match a relação de aspecto da área de desenho.
        double exibirAspecto = Math.abs((double) altura / largura);
        double aspectoPedido = Math.abs((inferior - superior) / (direita - esquerda));

        if (exibirAspecto > aspectoPedido) {
            // Expandir o viewport verticalmente.
            double excesso = (inferior - superior) * (exibirAspecto / aspectoPedido - 1);
            inferior += excesso / 2;
            superior -= excesso / 2;
        } else if (exibirAspecto < aspectoPedido) {
            // Expandir o viewport horizontalmente.
            double excesso = (direita - esquerda) * (aspectoPedido / exibirAspecto - 1);
            direita += excesso / 2;
            esquerda -= excesso / 2;
        }
    }

    grafico2d.scale(largura / (direita - esquerda), altura / (inferior - superior));
    grafico2d.translate(-esquerda, -superior);

    double larguraPixel = Math.abs((direita - esquerda) / largura);
    double alturaPixel = Math.abs((inferior - superior) / altura);

    tamanhoPixel = (float) Math.max(larguraPixel, alturaPixel);

}

}

3 Respostas

ViniGodoy
Solucao aceita

Certo… mas qual é o problema que você está tendo?

Provavelmente será algo como:

g2d.translate(x, 0);
 //Desenha o corpo da bicicleta
 var g2dRoda = g2d.create();
     g2dRoda.translate(posicãoPrimeiraRoda);
     g2dRoda.rotate(ratacaoPrimeiraRoda);
     //Desenha a roda
  g2dRoda.dispose();
  g2dRoda = g2d.create();
     g2dRoda.translate(posicãoSegundaRoda);
     g2dRoda.rotate(ratacaoSegundaRoda);
     //Desenha a roda
  g2dRoda.dispose();
g2d.dispose();
SG_Silvio

Obrigado pela resposta. já consegui resolver :smiling_face_with_three_hearts:
usei Thread para fazer o loop e a partir dá obter um incremento da variável para o translate.
Quanto ao rotate eu instanciei vários objetos do tipo Graphics2D e apliquei o rotate a cada objeto que eu precisava e assim nenhuma influencia a outra

Mais uma vez obrigado pela reposta,

ViniGodoy

Legal. Posta o código da solução e marca a resposta como solução do seu problema. Assim seu tópico pode ajudar outros no futuro.

Criado 27 de janeiro de 2020
Ultima resposta 30 de jan. de 2020
Respostas 3
Participantes 2