Рисование фигур средствами 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));

g.setStroke(реn3);

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

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

g.drawstring("JOIN_MITER", 40, 130);

g.drawstring("JOIN_ROUND", 180, 130);

g.drawstring("JOINJBEVEL", 330, 130);

g.drawstring("CAP_BUTT", 170, 190);

g.drawstring("CAP_ROUND", 170, 240);

g.drawstring("CAP_SQUARE", 170, 290);

g.setStroke(pen5);

g.drawfnew Line2D.Double(50, 330, 250, 330));

g.setStroke(pen4);

g.draw(new Line2D.Double(50, 360, 250, 360));

g.drawString("{10, 5, 5, 5,...}", 260, 335);

g.drawstring("(5, 10,...)", 260, 365);

}

public static void main(String[] args){

new StrokeTest("Моя программа");

}

}


Рис. 4. Перья с различными характеристиками.

 

После создания пера одним из конструкторов и установки пера методом setStroke() можно рисовать различные фигуры методами draw() и fill().

Общие свойства фигур, которые можно нарисовать методом draw() класса Graphics2D, описаны в интерфейсе shape. Этот интерфейс реализован для создания обычного набора фигур — прямоугольников, прямых, эллипсов, дуг, точек — классами Rectangle2D, RoundRectangle2D, Line2D, Ellipse2D, Arc2D, Point2D пакета java.awt.geom. В этом пакете есть еще классы CubicCurve2D и QuadCurve2D для создания кривых третьего и второго порядка.

Все эти классы абстрактные, но существуют их реализации — вложенные классы Double и Float для задания координат числами соответствующего типа. В примере 3 использованы классы Rectangle2D.Double И Line2D.Double для вычерчивания прямоугольников и отрезков.

Класс GeneralPath

Объекты класса java.awt.geom.GeneralPath могут содержать сложные конструкции, составленные из отрезков прямых или кривых линий и прочих фигур, соединенных или не соединенных между собой. Более того, поскольку этот класс реализует интерфейс shape, его экземпляры сами являются фигурами и могут быть элементами других объектов класса GeneralPath.

Вначале создается пустой объект класса GeneralPath конструктором по умолчанию GeneralPath() или объект, содержащий одну фигуру, конструктором GeneralPath (Shape sh).

Затем к этому объекту добавляются фигуры методом append (Shape sh, boolean connect)

Если параметр connect равен true, то новая фигура соединяется с предыдущими фигурами с помощью текущего пера.

В объекте есть текущая точка. Вначале ее координаты (0, 0), затем ее можно переместить в точку (х, у) методом moveTo (float x, float у).

От текущей точки к точке (х, у) можно провести:

· отрезок прямой методом lineTo(float x, float у);

· отрезок квадратичной кривой методом quadTo (float xi, float yl, float x, float y),

· кривую Безье методом curveTo(float xl, float yl, float x2, float y2, float x, float y).

Текущей точкой после этого становится точка (х, у). Начальную и конечную точки можно соединить методом closePath(). Вот как можно создать треугольник с заданными вершинами:

GeneralPath p = new GeneralPath();

p.moveTo(xl, yl); // Переносим текущую точку в первую вершину,

p.lineTo(x2, y2); // проводим сторону треугольника до второй вершины,

p.lineTo(x3, уЗ); // проводим вторую сторону,

p.closePath(); // проводим третью сторону до первой вершины

Способы заполнения фигур определены в интерфейсе Paint. В настоящее время Java 2D содержит три реализации этого интерфейса — классы Color, GradientPaint и TexturePamt.




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: