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
相关产品推荐
相关产品推荐

