如何旋转图形对象而不更改它的位置?

时间:2013-12-31 20:55:22

标签: java swing rotation paintcomponent graphics2d

我收到了以下代码:

import java.awt.*;
import javax.swing.*;

public class GraphicPanel extends JPanel {

    public void paintComponent(Graphics g){

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.setFont(new Font("Arial",Font.BOLD,24));
        g2d.drawString("A",300,250);
        g2d.rotate(45 * Math.PI/180);
        g2d.drawString("B",300,250);

    }

}

它应该旋转B并将它放在同一个地方A,但由于某种原因,B在一个完全不同的位置出现。

我很清楚我明白为什么会这样。这是因为在缩放,旋转等时操纵整个协调系统(我是否正确?)

无论如何,我想知道如何旋转或缩放一个物体,并且它仍然显示在它之前的位置。例如,在每10毫秒不断更新和显示自己的游戏中,精灵正在旋转,但仍然保持在10毫秒之前。

编辑:试图事先搜索谷歌,猜测这个问题的措辞有点棘手,因为我没有发现任何帮助。

非常感谢:)

3 个答案:

答案 0 :(得分:4)

当您在rotate对象上调用Graphics2D方法时,您将围绕原点旋转整个画布。因此,如果你从(300,250)处开始然后将它旋转45度(0,0),那么在旋转之后在(300,250)处绘制一个形状将在任何点映射时绘制它。

你应该使用the other form of rotate来获取旋转轴点的角度以及x和y坐标,并将你的点(300,250)传递给它。 (虽然,如果你想绕着字符或字符串的 center 旋转,你需要稍微调整一点。)

答案 1 :(得分:1)

围绕原点进行旋转,例如0,0的坐标系。如果要围绕不同的点旋转,则需要平移原点,旋转和平移,例如:

    g2d.translate(300, 250);
    g2d.rotate(45 * Math.PI/180);
    g2d.translate(-300, -250);
    g2d.drawString("B",300,250);

当然,您必须考虑要在帐户中旋转的对象的大小。这会围绕drawString绘制的点旋转,这是字符串的左侧基线。可能你想围绕中心旋转;然后你必须先测量对象,然后将这些值添加到翻译中。

答案 2 :(得分:0)

您只需将其放在x和y坐标中,以便它知道将对象绘制在何处

Graphics2D g2d= (Graphics2D) g;
        AffineTransform old = g2d.getTransform();
        g2d.rotate(Math.toRadians(50), x, y);
               
        //draw stuff or render images it works both
        
        g2d.setTransform(old);
        //this sets everything back to its place so only the object you put in rotates