Повернуть прямоугольник 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.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(); } } 

Для изображений вам нужно использовать метод 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 метод вместо краски.

Ссылаясь на API JComponent :

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

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

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

Другой способ – использовать 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.rotate заключается в том, что она не вращает ее вокруг определенной точки. Это будет главным образом беспорядок, где вы хотите свое изображение, а затем заставить вас перемещать координаты x и y изображения. Я бы не использовал его, особенно для игры. То, что вы должны изучить, это rotation точки в java.

  • Просмотрите файл изображения и покажите его с помощью Java Swing
  • Как получить местоположение щелчка мыши относительно windows поворота
  • проблема отображения курсора java wait
  • Загрузка ресурсов с помощью getClass (). GetResource ()
  • Как установить DPI приложений Java Swing в Windows / Linux?
  • Java KeyListener заикается
  • Как использовать TextAction
  • Как изменить цвет подсветки сфокусированного JComboBox
  • Поиск общего метода для создания компонентов GridBagLayout
  • Таймер обратного отсчета Java Swing Timer
  • Таймер Javax.swing повторяет штраф, но ActionListener ничего не делает
  • Давайте будем гением компьютера.