web-dev-qa-db-fra.com

Faire pivoter un Java Graphics2D Rectangle?

J'ai cherché partout et je n'arrive pas à trouver la réponse.
Comment faire pivoter un rectangle en java?

Voici une partie de mon code:

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){
        }
    }
}

J'ai essayé g2d.rotate (100D); mais cela n'a pas fonctionné. Merci d'avance.

Voici mon code édité:

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();
    }
}
15
chrypthic

Pour les images, vous devez utiliser la méthode drawImage de Graphics2D avec la relative AffineTransform .

Pour la forme, vous pouvez faire pivoter Graphics2D lui-même:

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

Et btw, vous devez remplacer la méthode paintComponent au lieu de Paint.

Citant JComponent 'API:

Appelé par Swing pour dessiner des composants. Les applications ne doivent pas appeler Paint directement, mais doivent plutôt utiliser la méthode repeindre pour planifier le composant pour le redessiner.

Cette méthode délègue en fait le travail de peinture à trois méthodes protégées: paintComponent, paintBorder et paintChildren. Ils sont appelés dans l'ordre indiqué pour garantir que les enfants apparaissent au-dessus du composant lui-même. De manière générale, le composant et ses enfants ne doivent pas peindre dans la zone d'encarts allouée à la bordure. Les sous-classes peuvent simplement remplacer cette méthode, comme toujours. Une sous-classe qui veut juste spécialiser la méthode Paint du délégué UI (look and feel) devrait simplement remplacer paintComponent.

N'oubliez pas que lorsque vous effectuez une transformation affine, comme une rotation, l'objet est implicitement tourné autour de l'axe Origine. Donc, si votre intention est de le faire pivoter autour d'un point arbitraire, vous devez avant de le retraduire à l'origine, de le faire pivoter, puis de le retraduire au point souhaité.

13
Heisenbug
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() et Graphics.dispose() vous permettent d'enregistrer les paramètres de transformation actuels (ainsi que la police, le trait, la peinture, etc.) actuels, et de les restaurer ultérieurement. C'est l'équivalent de glPushMatrix() et glPopMatrix() dans OpenGL.

Vous pouvez également appliquer une rotation inverse une fois que vous avez dessiné le rectangle pour ramener la matrice de transformation à son état initial. Cependant, les approximations en virgule flottante pendant les soustractions peuvent conduire à un faux résultat.

10
Aurelien Ribon

Une autre méthode consiste à utiliser Path2D, avec lui, vous pouvez faire pivoter le chemin uniquement et non l'objet graphique entier:

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);
6
Daniel De León