我到处搜寻,我找不到答案 如何在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();
}
}
答案 0 :(得分:12)
对于图像,您必须使用Graphics2D的drawImage方法和相对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的API:
由Swing调用以绘制组件。应用程序不应该调用 直接绘画,但应该使用重绘方法来安排 重绘的组件。
这种方法实际上将绘画作品委托给三个人 受保护的方法:paintComponent,paintBorder和paintChildren。 按照列出的顺序调用它们以确保孩子出现 组件本身的顶部。一般来说,组件及其组成部分 儿童不应该在分配给边界的插图区域绘画。 子类可以像往常一样覆盖此方法。一个子类 只是想专门化UI(外观和感觉)委托的绘画 方法应该只覆盖paintComponent。
还要记住,当您执行仿射变换(如旋转)时,对象会围绕轴原点隐式旋转。因此,如果您的意图是围绕任意点旋转它,您应该在将其转换回原点之前,旋转它,然后将其重新转换到所需的点。
答案 1 :(得分:10)
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()
允许您保存当前转换参数(以及当前字体,笔触,绘画等),并在以后恢复它们。它相当于OpenGL中的glPushMatrix()
和glPopMatrix()
。
绘制矩形后,您还可以应用反向旋转,以将变换矩阵恢复为初始状态。但是,在减法期间的浮点近似可能会导致错误的结果。
答案 2 :(得分:6)
另一种方法是使用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);
答案 3 :(得分:-1)
g2d.rotate唯一的问题是它不会围绕特定点旋转它。它会使您想要的图像陷入困境,然后强制您移动图像的x和y坐标。我不会用它,尤其是游戏。你应该研究的是在java中旋转一个点。