Ruota un’immagine in java dell’angolo specificato

Ecco la funzione che disegna una forma alle coordinate date:

public void drawTank(int x,int y){ int h = 50; int w = 50; graphic.setColor(Color.darkGray); graphic.drawRect(x, y, h, w); graphic.fillRect(x, y, h, w); graphic.setColor(Color.GRAY); graphic.drawRect(x+50, y+20, 35, 10); graphic.fillRect(x+50, y+20, 35, 10); } 

Voglio aggiungere un’altra variabile alla funzione precedente chiamata ‘angle’, in modo che l’immagine venga ruotata anche dall’angolo specificato (drawTank (int x, int y, int angle).

Aggiornato con l’esempio

Quello che ho cercato di fare è che ho inizializzato Graphics2D e cambiato il mio codice rispettivamente:

 g2D.setColor(Color.darkGray); g2D.drawRect(x, y, h, w); g2D.fillRect(x, y, h, w); g2D.setColor(Color.red); g2D.drawRect(x+50, y+20, 35, 10); g2D.fillRect(x+50, y+20, 35, 10); g2D.rotate((Math.toRadians(angle))); 

Ma questo in realtà non fa nulla. : /

La precedenza conta …

Nel tuo secondo esempio, applichi una rotazione DOPO che hai disegnato tutto. Non è così che funziona la grafica. È necessario applicare prima la trasformazione, quindi tutto ciò che segue utilizzerà questa trasformazione.

inserisci la descrizione dell'immagine qui

 public class TestRotateImage { public static void main(String[] args) { new TestRotateImage(); } public TestRotateImage() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JSlider slider; private Rectangle rectangle; public TestPane() { setLayout(new BorderLayout()); rectangle = new Rectangle(0, 0, 100, 100); slider = new JSlider(); slider.setMinimum(0); slider.setMaximum(360); slider.setMinorTickSpacing(5); slider.setMajorTickSpacing(10); slider.setValue(0); add(slider, BorderLayout.SOUTH); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { repaint(); } }); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } public double getAngle() { return Math.toRadians(slider.getValue()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.RED); g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight()); g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2); g2d.setColor(Color.BLACK); int x = (getWidth() - rectangle.width) / 2; int y = (getHeight() - rectangle.height) / 2; AffineTransform at = new AffineTransform(); at.setToRotation(getAngle(), x + (rectangle.width / 2), y + (rectangle.height / 2)); at.translate(x, y); g2d.setTransform(at); g2d.draw(rectangle); g2d.dispose(); } } } 

Potresti dare un’occhiata a Trasformare forms, testo e immagini per ulteriori informazioni

Ecco il modo bruto-force per farlo. Dai un’occhiata a Java.lang.Math e java.awt.Graphics (di cui hai già un’istanza di) Con questo puoi usare la funzione di disegno poligono per calcolare i punti del tuo rettangolo, che puoi fare usando il sin e cos funzioni in Java.lang.Math

In realtà, hai solo bisogno di calcolare due punti in questo modo, dato che il tuo punto di partenza sarebbe il vertice a 90 gradi da cui calcoleresti le due coordinate adiacenti. Da lì si tratta solo di fare qualche addizione e sottrazione con i punti che hai e i tuoi valori dimensionali per ottenere l’ultimo punto punto-angolo al tuo punto di partenza.

Lo capirei per te e scrivere un codice di esempio, ma che divertimento ti lascerebbe?