Преобразование координат. Класс AffineTransform.
Преобразования, заданные методами:
- concatenate(AffineTransform at)
- rotate(double angle)
- rotate(double angle, double x, double y)
- scale(double sx, double sy)
- shear(double shx, double shy)
- translate(double tx, double ty)
… выполняются перед текущим преобразованием, образуя композицию преобразований.
Преобразование, заданное методом preconcatenate(AffineTransform at), напротив, осуществляется после текущего преобразования.
Прочие методы класса AffineTransform производят преобразования различных фигур в пространстве пользователя.
Пора привести пример. Добавим в начало метода paint () в листинге 9.2 четыре оператора, как записано в листинге 9.3.
Листинг 9.3. Преобразование пространства пользователя.
// Начало листинга 9.2… public void paint(Graphics gr){ Graphics2D g = (Graphics2D)gr; AffineTransform at = AffineTransform.getRotatelnstance(-Math.PI/4.0, 250.0.150.0); at.concatenate( new AffineTransform(0.5, 0.0, 0.0, 0.5, 100.0, 60.0)); g.setTransform(at); Dimension d = getSize(); // Продолжение листинга 9.2
Метод paint () начинается с получения экземпляра g класса Graphics2D простым приведением аргумента gr к типу Graphics2D. Затем, методом getRotatelnstance () определяется поворот на 45° против часовой стрелки вокруг точки (250.0, 150.0). Это преобразование– экземпляр at класса AffineTransform. Метод concatenate (), выполняемый объектом at, добавляет к этому преобразованию сжатие в два раза по обеим осям координат и перенос начала координат в точку (100.0, 60.0). Наконец, композиция этих преобразований устанавливается как текущее преобразование объекта g методом setTransform().
Преобразование выполняется в следующем порядке. Сначала пространство пользователя сжимается в два раза вдоль обеих осей, затем начало координат пользователя – левый верхний угол – переносится в точку (100.0, 60.0) пространства графического устройства. Потом картинка поворачивается на угол 45° против часовой стрелки вокруг точки (250.0, 150.0).
Результат этих преобразований показан на рис. 9.3.
Рис. 9.3. Преобразование координат