Повернуть прямоугольник Java Graphics2D? - PullRequest
15 голосов
/ 22 сентября 2011

Я искал везде, и я просто не могу найти ответ.
Как повернуть прямоугольник в Java?

Вот мой код:

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

Я попробовал g2d.rotate (100D); но это не сработало. Заранее спасибо.

Вот мой отредактированный код:

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

Ответы [ 4 ]

12 голосов
/ 22 сентября 2011

Для изображений вы должны использовать drawImage метод Graphics2D с относительным AffineTransform .

Для фигуры вы можете вращать само Graphics2D:

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

И, кстати, вы должны переопределить метод paintComponent вместо рисования.

Цитирование JComponent API:

Вызывается Swing для рисования компонентов.Приложения не должны вызывать рисование напрямую, а вместо этого должны использовать метод repaint, чтобы запланировать перерисовку компонента.

Этот метод фактически делегирует работу рисования трем защищенным методам: paintComponent, paintBorder и paintChildren.Они вызываются в указанном порядке, чтобы гарантировать, что дочерние элементы появляются поверх самого компонента.Вообще говоря, компонент и его дочерние элементы не должны рисовать в области вставок, выделенных для границы.Подклассы могут просто переопределить этот метод, как всегда.Подкласс, который просто хочет специализировать метод рисования делегата UI (внешний вид), должен просто переопределить paintComponent.

Помните также, что когда вы выполняете аффинное преобразование, такое как вращение, объект неявно поворачиваетсявокруг оси происхождения.Поэтому, если вы намереваетесь повернуть его вокруг произвольной точки, вам следует перед тем, как перевести его обратно в начало координат, повернуть его, а затем перенести его в нужную точку.

10 голосов
/ 22 сентября 2011
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() и Graphics.dispose() позволяют сохранять текущие параметры преобразования (а также текущий шрифт, обводку, рисование и т. Д.) И восстанавливать их позже. Это эквивалент glPushMatrix() и glPopMatrix() в OpenGL.

Вы также можете применить обратное вращение после того, как нарисовали прямоугольник, чтобы вернуть матрицу преобразования обратно в исходное состояние. Однако приближения с плавающей точкой во время вычитаний могут привести к ложному результату.

6 голосов
/ 02 мая 2013

Другой способ - использовать Path2D, с его помощью вы можете вращать только путь, а не весь графический объект:

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);
0 голосов
/ 28 февраля 2013

Единственная проблема с g2d.rotate заключается в том, что он не поворачивает его вокруг определенной точки.В большинстве случаев он будет портить ваше изображение, а затем заставит вас перемещать координаты x и y изображения.Я бы не стал его использовать, особенно для игры.То, на что вы должны обратить внимание, это вращение точки в Java.

...