我收到了以下代码:
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毫秒之前。
编辑:试图事先搜索谷歌,猜测这个问题的措辞有点棘手,因为我没有发现任何帮助。
非常感谢:)
答案 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