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

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.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.
;
import java.lang.;
import javax.swing.
;

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);

}

}

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();

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,

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.