我正在使用 Java 的 Graphics2D 在使用 AffineTransform 的组件上绘制来操纵我的绘图。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, 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, 1)
}
预期行为
蓝色矩形(手动计算)覆盖了红色矩形(通过变换计算)。
有经验的行为
我承认我的 transformationMatrix 并不是真正的整数,但这不应该是问题,不是吗?
affineTransform = 1.1, 0.0, 520.55
0.0, 1.1, 182.54999999999995
0.0, 0.0, 1.0
这是一个错误还是我错过了一些深刻的见解?
编辑:如果您将 transformationMatrix 设置为
transformationMatrix = new AffineTransform(1.1, 0.0, 0.0, 1.1, 521.55, 183.54999999999995)
在paintComponent 的开头。请注意,g 的类型是 Graphics2D。