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タイプであることに注意してください。