Иллюстрированный самоучитель по Java

Преобразование координат. Класс AffineTransform.

Правило преобразования координат пользователя в координаты графического устройства (transform) задается автоматически при создании графического контекста так же, как цвет и шрифт. В дальнейшем его можно изменить методом setTransform() так же, как меняется цвет или шрифт. Аргументом этого метода служит объект класса AffineTransform из пакета java.awt.geom, подобно объектам класса color или Font при задании цвета или шрифта.

Рассмотрим подробнее класс AffineTransform.


Аффинное преобразование координат задается двумя основными конструкторами класса AffineTransform:

  • AffineTransform(double a, double b, double с, double d, double e, double f)
  • AffineTransform (float a, float b, float c, float d, float e, float f)

При этом точка с координатами (х, у) в пространстве пользователя перейдет в точку с координатами (а*х+с*у+е, b*x+d*y+f) в пространстве графического устройства.

Такое преобразование не искривляет плоскость – прямые линии переходят в прямые, углы между линиями сохраняются. Примерами аффинных преобразований служат повороты вокруг любой точки на любой угол, параллельные сдвиги, отражения от осей, сжатия и растяжения по осям.

Следующие два конструктора используют в качестве аргумента массив (а, b, с, d, e, f) или (а, b, с, d}, если e = f = о, составленный из таких же коэффициентов в том же порядке:

AffineTransform(double[] arr)
AffineTransform(float[] arr)

Пятый конструктор создает новый объект по другому, уже имеющемуся, объекту:

AffineTransform(AffineTransform at)

Шестой конструктор – конструктор по умолчанию – создает тождественное преобразование:

AffineTransform ()

Эти конструкторы математически точны, но неудобны при задании конкретных преобразований. Попробуйте рассчитать коэффициенты поворота на 57° вокруг точки с координатами (20, 40) или сообразить, как будет преобразовано пространство пользователя после выполнения методов:

AffineTransform at = new AffineTransform(-1.5, 4.45, – 0.56, 34.7, 2.68, 0.01);
g.setTransform(at);

Во многих случаях удобнее создать преобразование статическими методами, возвращающими объект класса AffineTransform.

  • getRotatelnstance (double angle) – возвращает поворот на угол angle, заданный в радианах, вокруг начала координат. Положительное направление поворота таково, что точки оси Ох поворачиваются в направлении к оси Оу. Если оси координат пользователя не менялись преобразованием отражения, то положительное значение angle задает поворот по часовой стрелке.
  • getRotatelnstance(double angle, double x, double у) – такой же поворот вокруг точки с координатами (х, у).
  • getScalelnstance (double sx, double sy) – изменяет масштаб по оси Ох в sx раз, по оси Оу – в sy раз.
  • getSharelnstance (double shx, double shy) – преобразует каждую точку (x, у) в точку (x+shx*y, shy*x+y).
  • getTranslatelnstance (double tx, double ty) – сдвигает каждую точку (х, у) в точку (x+tx, y+ty).

Метод createinverse () возвращает преобразование, обратное текущему преобразованию.

После создания преобразования его можно изменить методами:

  • setTransform(AffineTransform at)
  • setTransform(double a, double b, double c, double d, double e, double f)
  • setToIdentity()
  • setToRotation(double angle)
  • setToRotation(double angle, double x, double y)
  • setToScale(double sx, double sy)
  • setToShare(double shx, double shy)
  • setToTranslate(double tx, double ty)

… сделав текущим преобразование, заданное одним из этих методов.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.