на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Многопоточность и работа с потоками
p align="left">· Преобразование координат пользователя в координаты устройства можно задать "вручную", причем преобразованием способно служить любое аффинное преобразование плоскости, в частности, поворот на любой угол и/или сжатие/растяжение. Оно определяется как объект класса AffineTransform. Его можно установить как преобразование по умолчанию методом setTransform(). Возможно выполнять преобразование "на лету" методами transform() и translate() и делать композицию преобразований методом concatenate().

· Поскольку аффинное преобразование вещественно, координаты задаются вещественными, а не целыми числами.

· Графические примитивы: прямоугольник, овал, дуга и др., реализуют теперь новый интерфейс shape пакета java.awt. Для их вычерчивания можно использовать новый единый для всех фигур метод draw(), аргументом которого способен служить любой объект, реализовавший интерфейс shape. Введен метод fill(), заполняющий фигуры-- объекты класса, реализовавшего интерфейс shape.

· Для вычерчивания (Stroke) линий введено понятие пера (реn). Свойства пера описывает интерфейс Stroke. Класс BasicStroke реализует этот интерфейс. Перо обладает четырьмя характеристиками:

o оно имеет толщину (width) в один (по умолчанию) или несколько пикселов;

o оно может закончить линию (end cap) закруглением -- статическая константа CAP_ROUND, прямым обрезом -- CAP_SQUARE (по умолчанию), или не фиксировать определенный способ окончания -- CAP_BUTT;

o оно может сопрягать линии (line joins) закруглением -- статическая константа JOIN_ROOND, отрезком прямой -- JOIN_BEVEL, или просто состыковывать -- JOIN_MITER (по умолчанию);

o оно может чертить линию различными пунктирами (dash) и штрих-пунктирами, длины штрихов и промежутков задаются в массиве, элементы массива с четными индексами задают длину штриха, с нечетными индексами -- длину промежутка между штрихами.

· Методы заполнения фигур описаны в интерфейсе Paint. Три класса реализуют этот интерфейс. Класс Color реализует его сплошной (solid) заливкой, класс GradientPaint -- градиентным (gradient) заполнением, при котором цвет плавно меняется от одной заданной точки к другой заданной точке, класс TexturePaint -- заполнением по предварительно заданному образцу (pattern fill).

· Буквы текста понимаются как фигуры, т. е. объекты, реализующие интерфейс shape, и могут вычерчиваться методом draw() с использованием всех возможностей этого метода. При их вычерчивании применяется перо, все методы заполнения и преобразования.

· Кроме имени, стиля и размера, шрифт получил много дополнительных атрибутов, например, преобразование координат, подчеркивание или перечеркивание текста, вывод текста справа налево. Цвет текста и его фона являются теперь атрибутами самого текста, а не графического контекста. Можно задать разную ширину символов шрифта, надстрочные и подстрочные индексы. Атрибуты устанавливаются константами класса TextAttribute.

· Процесс визуализации (rendering) регулируется правилами (hints), определенными константами класса RenderingHints.

С такими возможностями Java 2D стала полноценной системой рисования, вывода текста и изображений. Посмотрим, как реализованы эти возможности, и как ими можно воспользоваться.

Преобразование координат

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

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

Класс 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} или {a, b, c, d}, если e = f = 0, составленный из таких же коэффициентов в том же порядке:

AffineTransform(double[] arr)

AffineTransform(float[] arr)

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

AffineTransform(AffineTransform at)

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

AffineTransform()

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

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

· getRotateInstance (double angle) -- возвращает поворот на угол angle, заданный в радианах, вокруг начала координат. Положительное направление поворота таково, что точки оси Ох поворачиваются в направлении к оси Оу. Если оси координат пользователя не менялись преобразованием отражения, то положительное значение angle задает поворот по часовой стрелке.

· getRotateInstance(double angle, double x, double у) -- такой же поворот вокруг точки с координатами (х, у).

· getScalelnstance (double sx, double sy) -- изменяет масштаб по оси Ох в sx раз, по оси Оу -- в sy раз.

· getSharelnstance(double shx, double shy)-- преобразует каждую точку (x, у) в точку (x+shx*y, shy*x+y).

· getTranslateInstance (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)

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

Преобразования, заданные методами:

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() в примере 1 четыре оператора, как записано в примере 2.

Пример 2. Преобразование пространства пользователя

// Начало примера 1...

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();

// Продолжение примера 1...

Метод paint() начинается с получения экземпляра gr класса 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).

Результат этих преобразований показан на рис. 3.

Рис. 3. Преобразование координат

Рисование фигур средствами Java2D

Характеристики пера для рисования фигур описаны в интерфейсе Stroke. В Java 2D есть пока только один класс, реализующий этот интерфейс -- класс BasicStroke.

Класс BasicStroke

Конструкторы класса BasicStroke определяют характеристики пера. Основной конструктор

BasicStroke(float width, int cap, int join, float miter, float[] dash, float dashBegin)

задает:

· толщину пера width в пикселах;

· оформление конца линии cap; это одна из констант:

o CAP_ROUND -- закругленный конец линии;

o CAP_SQUARE -- квадратный конец линии;

o CAP_BUTT -- оформление отсутствует;

· способ сопряжения линий join; это одна из констант:

o JOIN_ROUND -- линии сопрягаются дугой окружности;

o JOIN_BEVEL -- линии сопрягаются отрезком прямой, перпендикулярным биссектрисе угла между линиями;

o JOIN_MITER -- линии просто стыкуются;

· расстояние между линиями miter, начиная с которого применяется сопряжение JOIN_MITER;

· длину штрихов и промежутков между штрихами -- массив dash; элементы массива с четными индексами задают длину штриха в пикселах, элементы с нечетными индексами -- длину промежутка; массив перебирается циклически;

· индекс dashBegin, начиная с которого перебираются элементы массива

· dash.

Остальные конструкторы задают некоторые характеристики по умолчанию:

· BasicStroke (float width, int cap, int join, float miter) -- сплошная линия;

· BasicStroke (float width, int cap, int join) -- сплошная линия с сопряжением JOIN_ROUND или JOIN_BEVEL; для сопряжения JOIN_MITER задается значение miter = 10.0f;

· BasicStroke (float width) -- прямой обрез CAP_SQUARE и сопряжение JOIN_MITER со значением miter = 10.0f;

· BasicStroke () -- ширина1. 0f.

В примере 3 определено пять перьев с разными характеристиками, рис 4 показывает, как они рисуют.

Пример 3. Определение перьев

import java.awt.*;

import java.awt.geom. *;

import java.awt.event.*;

class StrokeTest extends Frame{

StrokeTest(String s) {

super(s) ;

setSize(500, 400);

setvisible(true);

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev)(

System.exit(0);

}

});

}

public void paint(Graphics gr){

Graphics2D g = (Graphics2D)gr;

g.setFont(new Font("Serif", Font.PLAIN, 15));

BasicStroke pen1 = new BasicStroke(20, BasicStroke.CAP_BUTT,

BasicStroke.JOIN_MITER,30);

BasicStroke pen2 = new BasicStroke(20, BasicStroke.CAP_ROUND,

BasicStroke.JOIN_ROUND);

BasicStroke реnЗ = new BasicStroke(20, BasicStroke.CAP_SQUARE,

BasicStroke.JOIN_BEVEL);

floatf] dash1 = {5, 20};

BasicStroke pen4 = new BasicStroke(10, BasicStroke.CAP_ROUND,

BasicStroke.JOIN_BEVEL, 10, dashl, 0);

float[] dash2 = (10, 5, 5, 5};

BasicStroke pen5 = new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10, dash2, 0);

g.setStroke(pen1);

g.draw(new Rectangle2D.Double(50, 50, 50, 50));

g.draw(new Line2D.Double(50, 180, 150, 180));

g.setStroke(pen2);

g.draw(new Rectangle2D.Double(200, 50, 50, 50));

g.draw(new Line2D.Double(50, 230, 150, 230));

Страницы: 1, 2, 3, 4, 5



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.