旋转和缩放 - 如何做到这两点并获得正确的结果?

时间:2009-03-25 18:03:56

标签: java graphics linear-algebra java-2d affinetransform

我有一组Java2D调用,可以在图形上下文中绘制矢量。我希望图像的尺寸加倍,然后旋转90度。

我正在使用以下代码执行此操作:

Graphics2D g2 = // ... get graphics 2d somehow ...
AffineTransform oldTransform = g2.getTransform();
AffineTransform newTransform = (AffineTransform)oldTransform.clone();
newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
// ... do my drawing ...

这会旋转并缩放,但是,比例不会按照我想要的方式应用。就像它在缩放之前旋转一样,从而使图像在错误的轴上变宽。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

我相信这些转换是像堆栈一样实现的 - 所以最后执行的是最后一次转换。尝试颠倒旋转和缩放变换的顺序,你应该得到你想要的东西。

newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));

答案 1 :(得分:2)

始终围绕原点执行旋转。要rotate about a certain point,您必须翻译积分。

This page解释了您尝试做的事情背后的数学,并说明了为什么需要按特定顺序应用转换。

答案 2 :(得分:1)

更改连接转换的顺序,以控制它们在合成中的应用顺序。