java2d对象的非破坏性转换

时间:2010-07-14 11:42:32

标签: java swing java-2d

我希望能够在没有Path2D.Double的Java2D场景上进行缩放和取消缩放 通过扩大距离来增加线条。

我尝试将转换应用于paintComponent方法接收的Graphics2D对象,但这会使线条变粗。我发现的唯一方法是对行应用转换(例如line.transform(AffineTransform.getScaleInstance(2d,2d))),但每次我再次缩放和取消缩放时,由于浮点错误而丢失信息。

长话短说:变革具有破坏性。有没有办法说“我想在不修改线条内容的情况下应用该转换绘制这条线”?

2 个答案:

答案 0 :(得分:1)

我找到了解决方案:我根据Graphic2D中的比例因子更改线宽,这样我就可以将变换应用到Graphic2D本身,并且它不会破坏Path2D中包含的原始坐标。

tr = g.getTransform()
g.transform(AffineTransform.getScaleInstance(scaleFactor,scaleFactor))
g.setStroke(new java.awt.BasicStroke(1.0f/scaleFactor.toFloat))
/* draw lines */
g.setTransform(tr)

答案 1 :(得分:0)

正如您所发现的那样,更改Graphics2D转换会影响所有绘图,但没有什么能阻止在paintComponent()内保存,修改和恢复转换。在此example中,内容是在缩放的上下文中绘制的,而围绕目标对象的Rectangle.Double则是未缩放的。

附录:example使用显式转换,但您可以使用AffineTransform。与Rectangle2D一样,Path2D实现了Shape界面,因此您可以相应地使用createInverse()createTransformedShape()。这是一个相关的example