代码之家  ›  专栏  ›  技术社区  ›  Pierre

使用仿射变换将形状缩放/转换为给定矩形

  •  3
  • Pierre  · 技术社区  · 15 年前

    我正在尝试缩放/转换java.awt文件. 形状 具有 以便在定义的边界矩形中绘制它。

    缩放 '参数。

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

    非常感谢

    皮埃尔

    2 回复  |  直到 15 年前
        1
  •  8
  •   trashgod    15 年前

    请注意 AffineTransform 转换被“以最常用的方式”连接起来,这可以被视为 最后一个 先出 命令。效果可见于此 example Shape 首先旋转,然后缩放,最后平移。

    at.translate(SIZE/2, SIZE/2);
    at.scale(60, 60);
    at.rotate(Math.PI/4);
    return at.createTransformedShape(...);
    
        2
  •  1
  •   Pierre    15 年前

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

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