2011-09-22 8 views
14

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

Ecco alcuni del mio codice:

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 actionPerformed(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 actionPerformed(ActionEvent e) 
    { 
     repaint(); 
    } 
} 
+0

questo modo si sono prima traducendo il rettangolo e poi ruotare. È equivalente a: new Rectangle (110,110,20,20); g2d.rotate (Math.toRadians (45)); – Heisenbug

risposta

11

Per le immagini si devono utilizzare drawImage metodo Graphics2D con la relativa AffineTransform.

Per la forma è possibile ruotare Graphics2D stessa:

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 btw, si dovrebbe ignorare il metodo paintComponent invece di vernice.

Citando JComponent 's API:

Invocato da altalena per disegnare i componenti. Le applicazioni non dovrebbero richiamare direttamente paint, ma dovrebbero invece utilizzare 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 compaiano su parte superiore del componente stesso. In generale, il componente e i relativi bambini non devono dipingere nell'area delle aree assegnate al bordo. Le sottoclassi possono semplicemente sovrascrivere questo metodo, come sempre. Una sottoclasse che lo studio vuole solo specializzare nell'interfaccia utente (look and feel) dipinga il metodo dovrebbe semplicemente sostituire paintComponent.

Ricorda anche che quando esegui una trasformazione affine, come una rotazione, l'oggetto 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.

+0

Grazie, prova, cosa c'è di meglio in paintComponent? – chrypthic

+0

K, l'ho provato. Ora il mio rettangolo è incuneato nell'angolo sinistro anche se ho impostato la posizione X su 100. Perché sta succedendo? (screenie: http://cl.ly/AM8c) – chrypthic

+0

"Ricorda anche che quando esegui una trasformazione affine, come una rotazione, l'oggetto viene ruotato implicitamente attorno all'origine dell'asse, quindi se il tuo intento è ruotarlo attorno a un arbitrario punto, dovresti prima di riportarlo all'origine, ruotarlo e quindi ridistribuirlo nel punto desiderato. " Come ho fatto? – chrypthic

10
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 in corso (così come font corrente, ictus, vernici, ecc), e di ripristinare in un secondo momento. È l'equivalente di glPushMatrix() e glPopMatrix() in OpenGL.

È anche possibile 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.

+0

non esiste il metodo di disegno per JComponent – Heisenbug

+0

Naturalmente, mi aspetto che l'op sappia come disegnare su un JPanel, questo è solo uno snippet di codice :) –

+0

+1 per l'_other_ ['ruotare()'] (http://download.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#rotate%28double,%20double,%20double%29). – trashgod

-1

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.

6

Un altro modo è quello di utilizzare Path2D, con esso è possibile ruotare il percorso e non l'intero oggetto Graphics:

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

Path2D è una fantastica funzionalità di Java2D che non conoscevo ... – Jose