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

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是定义纹理的平铺基准区域,如果你想让纹理匹配旋转后的矩形,更合理的做法是:

  1. 用原始矩形作为anchor创建TexturePaint
  2. 将旋转变换应用到Graphics2D对象,再绘制旋转后的矩形
    这样纹理会跟随坐标系一起旋转,完美匹配绘制的图形,而不是强行用旋转后的包围盒作为anchor(会导致纹理拉伸变形)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:55:17