java - 使用 AffineTransform 将形状缩放/平移到给定的矩形

标签 java graphics drawing shapes affinetransform

我正在尝试使用 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 吗?

非常感谢

皮埃尔

最佳答案

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

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

关于java - 使用 AffineTransform 将形状缩放/平移到给定的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843105/

相关文章:

java - 如何模拟测试下方法调用的方法

java - 使用 Java 图形 API 绘制图层

java - "Drawing"由控制台应用程序中的字符组成的填充椭圆

css - 滚动窗口时运行绘图 SVG

java - 在 Apache Tomcat 7 中部署 MyFaces CODI + Weld + JSF 时出错

java - omitEmptyStrings 无法正常工作

Python图形库: How to set the x and y coordinates of the window?

javascript - 如何在 Three.js 中对平面上的特定点进行动画处理或移动?

c++ - 我是否正确实现了这一点?

java - 在Springboot中,使用@ConfigurationProperties和@PropertySource时如何将属性序列化为对象?