Joh*_*ava 4 java swing awt rotation java-2d
我试图在JPanel中绘制一个矩形,它可以平移,然后自行旋转以模仿汽车的运动.我已经能够使矩形平移和旋转,但它围绕(0,0)的原点旋转.我非常高兴能够让矩形移动和旋转,因为我是Java GUI的新手,但我似乎无法得到如何使矩形围绕自身旋转,因为我尝试了更多它,当我初始化矩形并将其旋转45度,它的位置发生了变化,我假设是旋转方法附加的变换矩阵.
我通过网站查看了如何解决这个问题,但是我只找到了如何旋转矩形而不是如何旋转和移动模拟汽车的运动.我认为它关注它的变换矩阵,但我只是在猜测.所以我的问题是如何让矩形能够旋转并在自身周围移动而不是JPanel中的一个点.
这是我到目前为止提出的代码:
public class Draw extends JPanel implements ActionListener {
private int x = 100;
private int y = 100;
private double theta = Math.PI;
Rectangle rec = new Rectangle(x,y,25,25);
Timer timer = new Timer(25,this);
Draw(){
setBackground(Color.black);
timer.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.white);
rec.x = 100;
rec.y = 100;
g2d.rotate(theta);
g2d.draw(rec);
g2d.fill(rec);
}
public void actionPerformed(ActionEvent e) {
x = (int) (x + (Math.cos(theta))*1);
y = (int) (y + (Math.sin(theta))*1);
theta = theta - (5*Math.PI/180);
repaint();
}
Run Code Online (Sandbox Code Playgroud)
通常使用两种方法之一:
绕中心(图形上下文X,ÿ的)Shape
,如图所示在这里.
rotate(double theta, double x, double y)
Run Code Online (Sandbox Code Playgroud)转换到原点,旋转和平移回,如图所示这里.
g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
g2d.rotate(theta);
g2d.translate(-image.getWidth(null) / 2, -image.getHeight(null) / 2);
Run Code Online (Sandbox Code Playgroud)请注意第二个示例中连接的明显相反顺序.
附录:仔细观察您的示例,以下更改会Rectangle
围绕面板的中心旋转.
g2d.rotate(theta, getWidth() / 2, getHeight() / 2);
Run Code Online (Sandbox Code Playgroud)
此外,使用@Override
注释,并为您的面板提供合理的首选大小:
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
Run Code Online (Sandbox Code Playgroud)