3

我有一组在图形上下文中绘制矢量的 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 ...

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

有一个更好的方法吗?

4

3 回答 3

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));
于 2009-03-25T18:08:00.243 回答
2

始终围绕原点进行旋转。为了围绕某个点旋转,您必须平移这些点。

此页面解释了您尝试执行的操作背后的数学原理,并说明了为什么需要按特定顺序应用转换。

于 2009-03-25T18:22:07.773 回答
1

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

于 2009-03-25T18:07:00.790 回答