Ruota un rettangolo Graphics2D Java?

Ho cercato ovunque e non riesco a trovare la risposta.
Come ruoto un rettangolo in java?

Ecco alcuni dei miei codici:

package net.chrypthic.Space; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Space extends JPanel implements ActionListener{ Timer time; public Space() { setVisible(true); setFocusable(true); addMouseMotionListener(new ML()); addMouseListener(new ML()); addKeyListener(new AL()); time=new Timer(5, this); time.start(); } public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D)g; g2d.setColor(Color.WHITE); Rectangle rect2 = new Rectangle(100, 100, 20, 20); g2d.draw(rect2); g2d.fill(rect2); } public void actionPerformsd(ActionEvent ae) { repaint(); } public class AL extends KeyAdapter { public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } } public class ML extends MouseAdapter { public void mouseMoved(MouseEvent e) { } public void mousePressed(MouseEvent e){ } } } 

Ho provato g2d.rotate (100D); ma non ha funzionato. Grazie in anticipo.

Ecco il mio codice modificato:

 package net.chrypthic.Space; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Space extends JPanel implements ActionListener{ Timer time; public Space() { setVisible(true); setFocusable(true); setSize(640, 480); setBackground(Color.BLACK); time=new Timer(5, this); time.start(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; Rectangle rect1 = new Rectangle(100, 100, 20, 20); g2d.setColor(Color.WHITE); g2d.translate(rect1.x+(rect1.width/2), rect1.y+(rect1.height/2)); g2d.rotate(Math.toRadians(90)); g2d.draw(rect1); g2d.fill(rect1); } public void actionPerformsd(ActionEvent e) { repaint(); } } 

Per le immagini devi usare il metodo drawImage di Graphics2D con il relativo AffineTransform .

Per forma puoi ruotare Graphics2D stesso:

 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setColor(Color.WHITE); Rectangle rect2 = new Rectangle(100, 100, 20, 20); g2d.rotate(Math.toRadians(45)); g2d.draw(rect2); g2d.fill(rect2); } 

E a proposito, dovresti sostituire il metodo paintComponent anziché la vernice.

Citando l’API di JComponent :

Invocato da Swing per disegnare componenti. Le applicazioni non dovrebbero richiamare direttamente la vernice, ma dovrebbero invece usare il metodo repaint per pianificare il componente per il ridisegno.

Questo metodo in realtà delega il lavoro di pittura a tre metodi protetti: paintComponent, paintBorder e paintChildren. Vengono chiamati nell’ordine elencato per garantire che i bambini vengano visualizzati in cima al componente stesso. In linea generale, il componente e i suoi bambini non devono dipingere nell’area dell’inserto assegnato al confine. Le sottoclassi possono semplicemente sovrascrivere questo metodo, come sempre. Una sottoclass che vuole solo specializzare il metodo di disegno del delegato dell’interfaccia utente (look and feel) dovrebbe semplicemente sovrascrivere paintComponent.

Ricorda anche che quando esegui una trasformazione affine, come una rotazione, l’object viene ruotato implicitamente attorno all’origine dell’asse. Quindi, se il tuo intento è di ruotarlo attorno a un punto arbitrario, dovresti prima di riportarlo all’origine, ruotarlo e quindi ridistribuirlo nel punto desiderato.

 public void draw(Graphics2D g) { Graphics2D gg = (Graphics2D) g.create(); gg.rotate(angle, rect.x + rect.width/2, rect.y + rect.height/2); gg.drawRect(rect.x, rect.y, rect.width, rect.height); gg.dispose(); gg = (Graphics2D) g.create(); ... other stuff } 

Graphics.create() e Graphics.dispose() consentono di salvare i parametri di trasformazione correnti (nonché il font corrente, il tratto, la pittura, ecc.) E di ripristinarli successivamente. È l’equivalente di glPushMatrix() e glPopMatrix() in OpenGL.

Puoi anche applicare una rotazione inversa dopo aver disegnato il rettangolo per riportare la matrice di trasformazione allo stato iniziale. Tuttavia, le approssimazioni in virgola mobile durante le sottostrutture possono portare a un risultato falso.

Un altro modo è usare Path2D , con esso puoi ruotare solo il percorso e non l’intero object grafico:

 Rectangle r = new Rectangle(x, y, width, height); Path2D.Double path = new Path2D.Double(); path.append(r, false); AffineTransform t = new AffineTransform(); t.rotate(angle); path.transform(t); g2.draw(path); 

L’unico problema con g2d.rotate è che non lo ruota attorno a un punto specifico. Per lo più rovinerà dove vuoi la tua Immagine e poi ti costringerà a spostare le coordinate xey dell’immagine. Non lo userei, specialmente per un gioco. Quello che dovresti esaminare è ruotare un punto in java.