1 回答
TA贡献1833条经验 获得超4个赞
我查看了这本书,发现用法AffineTransform.preConcatenate()令人困惑。我更喜欢使用AffineTransform.concatenate(),因为对我来说这提供了更自然的流程。
让我们看第一个例子(变换,然后交换 y 方向)。
这是你的代码:
AffineTransform at1 = new AffineTransform();
at1.setToScale(1,-1);
AffineTransform at2 = new AffineTransform();
at2.setToTranslation(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);
at1.preConcatenate(at2);
使用 using concatenate,您可以将其写为:
AffineTransform at1 = new AffineTransform();
at1.setToTranslation(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);
AffineTransform at2 = new AffineTransform();
at2.setToScale(1,-1);
at1.concatenate(at2);
或者,甚至更短:
AffineTransform at = new AffineTransform();
at.translate(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);
at.scale(1,-1);
您可以看到代码中直接表示的“翻译,然后缩放”流程。
对于第二个测试,您可以应用相同的方法:
// Affine Transformation 3, 4 and 5
// ╭ umax − umin vmax − vmin ╮
// T(umin, vmin) ◦ S | ----------- , ----------- | ◦ T(-xmin, -ymin)
// ╰ xmax − xmin ymax − ymin ╯
AffineTransform at = new AffineTransform();
at.translate(umin, vmin);
at.scale((umax-umin)/(xmax-xmin), (vmax-vmin)/(ymax-ymin));
at.translate(-xmin, -ymin);
注意这一点:umin, vmin已经表示左下屏幕坐标和umax, vmax右上屏幕坐标,所以不需要额外的平移或y轴翻转!
一些结束语:
Java2D 中线的默认宽度是一个缩放单位。选择
ymin
和ymax
后,一个缩放单位会填满窗口的整个高度。g2d.setStroke(new BasicStroke(0.0f));
为了不只得到一个填充的矩形,您应该在调用之前将线宽设置为可能的最小值g2d.draw()
。的参数
Rectangle2D.Double()
是x, y, w, h
,因此您在第二个示例中创建矩形对象的代码可能应该读取Rectangle2D.Double rectangle = new Rectangle2D.Double(0, 1.5, 100, 1);
(高度为 2.5,上边框不会显示在屏幕上)。
添加回答
举报