Graphics2D为此提供了一个方法转换,它采用了AffineTransform.
有时我需要手动操作一个点而不使用内置转换.
但是当我尝试使用相同的变换转换一个点时,我给了Graphics2D.transform有时结果点不一样.
下面的代码重现了这个问题(它是Scala代码,但我认为你可以想象Java代码.):
var transformationMatrix = new AffineTransform() /* * transformationMatrix is modified throughout the program * ... */ override def paintComponent(g: Graphics2D) = { super.paintComponent(g) /* 1. transform using graphics transform */ g.transform(transformationMatrix) g.setColor(Color.RED) g.fill(new Rectangle(0,1,1)) /* 2. transform point manually */ g.setTransform(new AffineTransform) // reset transformation to standard val p0 = new Point(0,0) val pDest = new Point() transformationMatrix.transform(p0,pDest) g.setColor(Color.BLUE) g.fill(new Rectangle(pDest.x,pDest.y,1) }
预期的行为
蓝色矩形(手动计算)透过红色矩形(通过变换计算).
经验丰富的行为
我承认我的transformationMatrix并不是真正的整数,但那应该不是问题,不是吗?
affineTransform = 1.1,0.0,520.55 0.0,1.1,182.54999999999995 0.0,1.0
编辑:如果将transformationMatrix设置为,则可以重现该错误
transformationMatrix = new AffineTransform(1.1,521.55,183.54999999999995)
在paintComponent的开头.请注意,g是Graphics2D类型.
解决方法
在(1)中,您要对产生小数坐标的变换进行形状(与Rectangle而不是Rectangle2D.Double无关).它只是涂有别名,因为您没有设置特定的渲染提示(RenderingHints.KEY_ANTIALIASING – > RenderingHints.VALUE_ANTIALIAS_ON和RenderingHints.KEY_stroke_CONTROL – > RenderingHints.VALUE_stroke_PURE).
在(2)中,您将一个点置于变换中,并将其强制转换为别名坐标(Point而不是Point2D.Double).然后从那一点开始连续构造一个矩形.
很明显,幕后可能会发生非常不同的事情,我根本不会期望转换为整数点,而在混叠图形上下文中绘制浮点形状会产生相同的结果.
(没有测试)我猜想(1)的有效等价陈述是
g.fill(transformationMatrix.createTransformedShape(new Rectangle(0,1)))
原文地址:https://www.jb51.cc/java/120562.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。