Я использую 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)
}
Ожидаемое поведение
Синий прямоугольник (, рассчитанный вручную ), перерисовывает красный прямоугольник (, рассчитанный преобразованием ).
Опытное поведение
Я признаю, что моя матрица трансформации не является целочисленной, но это не должно быть проблемой, не так ли?
affineTransform = 1.1, 0.0, 520.55
0.0, 1.1, 182.54999999999995
0.0, 0.0, 1.0
Это ошибка или мне не хватает глубокого понимания?
Изменить:Вы можете воспроизвести ошибку, если установите для свойства трансформацииMatrix значение
transformationMatrix = new AffineTransform(1.1, 0.0, 0.0, 1.1, 521.55, 183.54999999999995)
. в начале paintComponent. Обратите внимание, что g имеет тип Graphics2D.