【问题标题】:Scaling/Translating a Shape to a given Rectangle using AffineTransform使用 AffineTransform 将形状缩放/转换为给定的矩形
【发布时间】:2010-10-01 21:18:15
【问题描述】:

我正在尝试使用 AffineTransform 缩放/平移 java.awt.Shape,以便在定义的边界矩形中绘制它。

此外,我想在具有'zoom'参数的绘图区域中绘制它。

我尝试了 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 有任何想法吗?

非常感谢

皮埃尔

【问题讨论】:

    标签: java graphics drawing shapes affinetransform


    【解决方案1】:

    请注意,AffineTransform 转换是“以最常用的方式”连接的,这可以被视为 last infirst-out 顺序。效果可以看这个example。给定以下顺序,生成的Shape 首先旋转,然后缩放,最后平移。

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

    【讨论】:

    • 我会验证您的答案,因为您的“后进先出”表达启发了解决方案
    • 这是一个用于推理结果的有用概念;但是,当然,没有队列,只有一个包含一系列操作的变换。
    【解决方案2】:

    受垃圾神回答的启发,正确的顺序是:

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

    【讨论】:

    • +1 可能值得为 beforeafter 比较添加原始代码。
    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多