You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Graphics2D的rotate方法调用后后续绘制内容出现Y轴抖动问题

问题原因

你遇到的抖动是浮点运算精度误差累积导致的。两次调用rotate()方法传入正反参数,本质是对Graphics2D内部的变换矩阵做两次乘法运算,受限于浮点数精度,两次运算后的矩阵无法100%还原到初始状态,每一次repaint()都会叠加一点微小的误差,次数多了之后就会体现为第二个矩形的位置偏移抖动。

最优解决方法

在修改变换前先保存Graphics2D的原始变换状态,绘制完旋转内容后直接恢复原始状态,完全避免反向变换的误差,这也是Swing绘图的标准最佳实践。

修改后的paintComponent代码如下:

import java.awt.geom.AffineTransform; // 需额外导入该类

// 类内的paintComponent方法
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    // 保存原始变换状态
    AffineTransform originalTransform = g2d.getTransform();

    // 执行旋转绘制逻辑
    g2d.rotate(Math.toRadians(degrees), 100, 185);
    g2d.fillRect(40, 125, 120, 120);

    // 直接恢复到初始变换状态,无需计算反向变换参数
    g2d.setTransform(originalTransform);
    g2d.fillRect(225, 125, 120, 120);
}

其他可选优化方案

如果不想额外保存变换,也可以将角度转弧度的计算合并为一次,正反旋转使用同一个计算结果,能大幅降低误差累积的速度,但长期运行还是可能出现微小抖动:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    // 仅计算一次弧度值,正反旋转复用
    double rad = Math.toRadians(degrees);
    g2d.rotate(rad, 100, 185);
    g2d.fillRect(40, 125, 120, 120);
    g2d.rotate(-rad, 100, 185);
    g2d.fillRect(225, 125, 120, 120);
}

内容的提问来源于stack exchange,提问作者mousekip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 22:21:00