-->

缩放/使用翻译一个形状给定矩形的AffineTransform缩放/使用翻译一个形状给定矩形的Aff

2019-05-12 08:45发布

我试图扩展/翻译了java.awt中。 为了把它收回去定义的矩形边框用的AffineTransform 形状

此外,我要画它在具有“ 缩放 ”参数绘图区。

我试过的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任何想法?

非常感谢

皮埃尔

Answer 1:

注意AffineTransform转换是“在最常用的方式”连接起来,这可能先出的顺序被看作是最后一次 。 效果可在此可以看到示例 。 下面给出的序列,所得到的Shape是第一旋转,则定标和最后平移。

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


Answer 2:

通过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]);
 }


文章来源: Scaling/Translating a Shape to a given Rectangle using AffineTransform