rotate(double theta)
Java 中的rotate()
方法详解
rotate(double theta)
是 Java 2D 图形 API 中的一个变换方法,它可以让你对绘制的内容进行旋转。这个方法属于Graphics2D
类,是 Java Swing 和 AWT 中用于高级绘图的工具。
参数解释
theta
:旋转角度,以弧度为单位。- 正角度表示顺时针旋转
- 负角度表示逆时针旋转
- 例如:
Math.PI/2
(约 1.57)表示旋转 90 度
注意事项
- 旋转操作会影响后续绘制的所有内容
- 默认旋转中心是坐标原点 (0,0),通常是窗口左上角
- 可以通过
rotate(theta, x, y)
指定旋转中心点import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import java.io.File; import javax.imageio.ImageIO; public class ImageRotationDemo extends JPanel implements ActionListener { private Image image; // 要旋转的图片 private double angle = 0; // 当前旋转角度(弧度) private Timer timer; // 用于定时更新旋转角度 private int centerX, centerY; // 旋转中心点 public ImageRotationDemo() { try { // 加载图片(请确保路径正确) image = ImageIO.read(new File("src/a1.png")); // 如果没有图片,显示错误信息 if (image == null) { throw new Exception("图片未找到"); } } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, "无法加载图片: " + e.getMessage()); } // 创建按钮控制旋转 JButton rotateButton = new JButton("旋转图片"); rotateButton.addActionListener(e -> { if (timer.isRunning()) { timer.stop(); rotateButton.setText("继续旋转"); } else { timer.start(); rotateButton.setText("暂停旋转"); } }); // 添加按钮到面板 JPanel buttonPanel = new JPanel(); buttonPanel.add(rotateButton); // 设置主面板布局 setLayout(new BorderLayout()); add(buttonPanel, BorderLayout.NORTH); // 创建定时器,每50毫秒触发一次更新 timer = new Timer(50, this); timer.start(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (image != null) { // 获取Graphics2D对象,用于高级绘图 Graphics2D g2d = (Graphics2D) g; // 启用抗锯齿,使旋转后的图片更平滑 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 计算图片的中心点 centerX = getWidth() / 2; centerY = getHeight() / 2; // 保存当前的图形状态 AffineTransform originalTransform = g2d.getTransform(); // 移动坐标系到图片中心 g2d.translate(centerX, centerY); // 旋转坐标系 g2d.rotate(angle); // 绘制图片,注意坐标要调整为相对于中心点的位置 g2d.drawImage(image, -image.getWidth(this) / 2, // X坐标:负的图片宽度的一半 -image.getHeight(this) / 2, // Y坐标:负的图片高度的一半 this); // 恢复原始的图形状态,确保后续绘制不受影响 g2d.setTransform(originalTransform); // 显示当前旋转角度(转换为度数) g2d.drawString("旋转角度: " + Math.round(Math.toDegrees(angle)) + "°", 10, 20); } else { g.drawString("图片未加载", 50, 50); } } @Override public void actionPerformed(ActionEvent e) { // 每次定时器触发时,增加旋转角度 angle += 0.05; // 每次增加0.05弧度(约2.86度) // 如果角度超过2π(一圈),则重置,避免数值过大 if (angle > 2 * Math.PI) { angle -= 2 * Math.PI; } // 重绘面板,显示新的旋转角度 repaint(); } public static void main(String[] args) { JFrame frame = new JFrame("图片旋转演示"); ImageRotationDemo demo = new ImageRotationDemo(); frame.add(demo); frame.setSize(600, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
-
坐标变换:
translate(x, y)
:移动坐标系原点到 (x,y)rotate(angle)
:绕当前原点旋转坐标系- 这两个操作会影响后续所有的绘图命令
-
保存和恢复图形状态:
- 使用
AffineTransform
保存当前变换状态 - 旋转完成后恢复状态,避免影响其他绘图
- 使用
-
角度计算:
- Java 使用弧度而非度数(180 度 = π 弧度)
- 使用
Math.toDegrees()
将弧度转换为度数显示
-
动画实现:
- 使用
Timer
定期更新旋转角度 - 调用
repaint()
触发重绘,产生动画效果
- 使用