Java中如何旋转缩放Rectangle2D并返回Rectangle2D实例
关于Rectangle2D变换后获取新Rectangle2D的解决方案
首先明确核心限制:Java的Rectangle2D仅支持轴对齐的矩形,任何旋转变换(非0角度)、斜切变换都会让结果不再是轴对齐,因此无法直接通过AffineTransform得到Rectangle2D实例——这类变换的结果只能是Shape或Path2D。
下面分场景给出具体实现:
场景1:仅平移/轴对齐缩放(无旋转、斜切)
这种情况无需通过Shape转换,直接计算变换后的轴对齐矩形即可:
// 示例:对目标矩形做缩放+平移变换 Rectangle2D.Double originalRect = new Rectangle2D.Double(10, 10, 100, 50); double scaleX = 1.5; double scaleY = 2.0; double tx = 20; double ty = 30; // 构造变换矩阵 AffineTransform transform = AffineTransform.getScaleInstance(scaleX, scaleY); transform.translate(tx, ty); // 计算原始矩形四个顶点的变换后坐标 double[] vertices = { originalRect.x, originalRect.y, originalRect.x + originalRect.width, originalRect.y, originalRect.x, originalRect.y + originalRect.height, originalRect.x + originalRect.width, originalRect.y + originalRect.height }; transform.transform(vertices, 0, vertices, 0, 4); // 推导轴对齐包围盒的边界 double minX = Double.MAX_VALUE, minY = Double.MAX_VALUE; double maxX = Double.MIN_VALUE, maxY = Double.MIN_VALUE; for (int i = 0; i < vertices.length; i += 2) { minX = Math.min(minX, vertices[i]); minY = Math.min(minY, vertices[i+1]); maxX = Math.max(maxX, vertices[i]); maxY = Math.max(maxY, vertices[i+1]); } // 生成变换后的Rectangle2D Rectangle2D.Double transformedRect = new Rectangle2D.Double(minX, minY, maxX - minX, maxY - minY);
场景2:旋转/斜切后,从Path2D/Shape提取Rectangle2D
如果已经通过变换得到了Path2D或Shape,可以直接调用其getBounds2D()方法获取轴对齐包围盒(这就是Rectangle2D实例):
// 复用你提供的旋转代码 Rectangle2D.Double rectFinal = new Rectangle2D.Double(10,10,100,50); AffineTransform transformRect = new AffineTransform(); // 绕矩形中心旋转(示例角度) double rotateAngle = Math.toRadians(30); transformRect.rotate(rotateAngle, rectFinal.getX() + rectFinal.getWidth()/2, rectFinal.getY() + rectFinal.getHeight()/2); // 获取变换后的Shape Shape rotatedShape = transformRect.createTransformedShape(rectFinal); // 提取轴对齐包围盒(Rectangle2D类型) Rectangle2D transformedBounds = rotatedShape.getBounds2D();
这个transformedBounds可以直接作为TexturePaint的anchor参数。
关于TexturePaint的anchor参数的注意点
TexturePaint的anchor是定义纹理的平铺基准区域,如果你想让纹理匹配旋转后的矩形,更合理的做法是:
- 用原始矩形作为
anchor创建TexturePaint - 将旋转变换应用到
Graphics2D对象,再绘制旋转后的矩形
这样纹理会跟随坐标系一起旋转,完美匹配绘制的图形,而不是强行用旋转后的包围盒作为anchor(会导致纹理拉伸变形)。
内容的提问来源于stack exchange,提问作者jazznbass
相关产品推荐
相关产品推荐

