Повернуть прямоугольник Java Graphics2D?
Я искал везде, и я просто не могу найти ответ.
Как повернуть Rectangle в 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();
}
}
Ответы
Ответ 1
Для изображений вы должны использовать 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);
}
И btw, вы должны переопределить метод paintComponent вместо краски.
Цитирование JComponent API:
Вызывается Swing для рисования компонентов. Приложения не должны ссылаться краска непосредственно, но вместо этого следует использовать метод repaint для расписания компонент для перерисовки.
Этот метод фактически делегирует работу живописи на три защищенные методы: paintComponent, paintBorder и paintChildren. Они вызываются в указанном порядке, чтобы гарантировать, что дети появятся на вершина самого компонента. Вообще говоря, компонент и его дети не должны рисовать в области вставки, выделенной для границы. Подклассы могут просто переопределять этот метод, как всегда. Подкласс, который просто хочет специализироваться на пользовательском интерфейсе (внешний вид) метод должен просто переопределить paintComponent.
Помните также, что когда вы выполняете аффинное преобразование, подобно вращению, объект неявно поворачивается вокруг начала оси. Поэтому, если ваше намерение состоит в том, чтобы повернуть его вокруг произвольной точки, вы должны перевести его обратно в начало координат, повернуть его, а затем снова перетащить в нужную точку.
Ответ 2
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.
Вы также можете применить обратное вращение, как только вы нарисуете прямоугольник, чтобы вернуть матрицу преобразования в исходное состояние. Однако аппроксимации с плавающей запятой при подстановках могут привести к ложному результату.
Ответ 3
Другой способ - использовать 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);
Ответ 4
Единственная проблема с g2d.rotate заключается в том, что она не вращает ее вокруг определенной точки. Это будет главным образом беспорядок, где вы хотите свое изображение, а затем заставить вас перемещать координаты x и y изображения. Я бы не использовал его, особенно для игры. То, что вы должны изучить, - это вращение точки в java.