使用AffineTransform将Shape缩放/转换为给定的Rectangle

我正在尝试扩展/翻译java.awt。 使用AffineTransform进行形状 ,以便在定义的边界Rectangle中绘制它。

此外,我想在具有“ 缩放 ”参数的绘图区域中绘制它。

我尝试了各种AffineTransform连接,但我找不到正确的序列。 例如,以下解决方案是错误的:

double zoom=(...);/* current zoom */ Rectangle2D viewRect=(...)/** the rectangle where we want to paint the shape */ Shape shape=(...)/* the original shape that should fit in the rectangle viewRect */ Rectangle2D bounds=shape.getBounds2D(); double ratioW=(viewRect.getWidth()/bounds.getWidth()); double ratioH=(viewRect.getHeight()/bounds.getHeight()); AffineTransform transforms[]= { AffineTransform.getScaleInstance(zoom, zoom), AffineTransform.getTranslateInstance(-bounds.getX(),-bounds.getY()), AffineTransform.getTranslateInstance(viewRect.getX(),viewRect.getY()), AffineTransform.getScaleInstance(ratioW, ratioH) }; AffineTransform tr=new AffineTransform(); for(int i=0;i< transforms.length;++i) { tr.concatenate(transforms[i]); } Shape shape2=tr.createTransformedShape(shape); graphics2D.draw(shape2); 

关于正确的AffineTransform的任何想法?

非常感谢

皮埃尔

请注意, AffineTransform转换是“以最常用的方式”连接的,可以将其视为后进先出顺序。 在这个例子中可以看到效果。 给定下面的序列,首先旋转生成的Shape ,然后缩放,最后翻译。

 at.translate(SIZE/2, SIZE/2); at.scale(60, 60); at.rotate(Math.PI/4); return at.createTransformedShape(...); 

受trashgod的回答启发,正确的顺序是:

 AffineTransform transforms[]= { AffineTransform.getScaleInstance(zoom, zoom), AffineTransform.getTranslateInstance(viewRect.getX(),viewRect.getY()), AffineTransform.getScaleInstance(ratioW, ratioH), AffineTransform.getTranslateInstance(-bounds.getX(),-bounds.getY()) }; AffineTransform tr=new AffineTransform(); for(int i=0;i< transforms.length;++i) { tr.concatenate(transforms[i]); }