Повернуть прямоугольник Java Graphics2D?
Я искал везде и я просто не могу найти ответ.
Как повернуть прямоугольник в 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.поворот (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 ответов
для изображений вы должны использовать 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 вместо paint.
со ссылкой на JComponentС АПИ:
краски компоненты. Приложения не должны вызывать краска сразу, но должна вместо использовать способ перекраски по расписанию компонент для перерисовки.
этот метод фактически делегирует работу живописи трем защищенные методы: paintComponent, paintBorder и paintChildren. Они вызываются в указанном порядке, чтобы убедиться, что дети появляются на верхняя часть самого компонента. Вообще говоря, компонент и его дети не должны рисовать в области вставок, выделенной на границе. Подклассы могут переопределить этот метод так, как всегда. Подкласс, который просто хочет специализировать UI (внешний вид) делегата paint метод должен просто переопределить paintComponent.
Помните также, что при выполнении аффинного преобразования, например вращения, объект неявно вращается вокруг начала оси. Поэтому, если вы намерены повернуть его вокруг произвольной точки, вы должны, прежде чем переводить его обратно в начало координат, повернуть его, а затем повторно перевести его в нужную точку.
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.
вы также можете применить обратное вращение после рисования прямоугольника, чтобы вернуть матрицу преобразования в исходное состояние. Однако приближения с плавающей запятой во время подстрок могут привести к ложному результату.
другой способ-использовать 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);
единственная проблема с g2d.поворот-это то, что он не вращает его вокруг определенной точки. Это в основном испортит, где вы хотите свое изображение, а затем заставит вас переместить координаты x и y изображения. Я бы не стал использовать его, особенно для игры. То, что вы должны посмотреть, - это поворот точки на java.