我正在尝试缩放/翻译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的想法?
非常感谢
皮埃尔
I'm trying to scale/translate a java.awt.Shape with AffineTransform in order to draw it in a defined bounding Rectangle.
Moreover, I want to paint it in a drawing Area having a 'zoom' parameter.
I tried various concatenations of AffineTransform but I couldn't find the correct sequence. For example, the following solution was wrong:
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);Any idea about the correct AffineTransform ?
Many thanks
Pierre
最满意答案
请注意, AffineTransform转换以“最常用的方式”连接在一起,这可能会被视为最后的 先进顺序。 在这个例子中可以看到效果。 根据下面的顺序,生成的Shape首先被旋转,然后被缩放并最终被翻译。
at.translate(SIZE/2, SIZE/2); at.scale(60, 60); at.rotate(Math.PI/4); return at.createTransformedShape(...);Note that AffineTransform transformations are concatenated "in the most commonly useful way", which may be regarded as last in, first-out order. The effect can be seen in this example. Given the sequence below, the resulting Shape is first rotated, then scaled and finally translated.
at.translate(SIZE/2, SIZE/2); at.scale(60, 60); at.rotate(Math.PI/4); return at.createTransformedShape(...);更多推荐
发布评论