ПОСТРОЕНИЕ ИЗОБРАЖЕНИЙ И ВЫВОД ТЕКСТА

МАШИННАЯ ГРАФИКА

 

Машинная графика - совокупность методов и средств для преобразования данных в графическую форму представления и обратно с помощью ЭВМ.

Системы машинной графики на ПЭВМ относят к нескольким классам:

· иллюстративная графика (создание изображений, играющих роль иллюстративного материала - рисунки, схемы, эскизы);

· деловая графика (позволяет в наглядной форме отображать данные, хранимые в таблицах или базах данных, в виде графиков, диаграмм, гистограмм);

· инженерная графика (автоматизация чертежных и конструкторских работ);

· научная графика (создание и обработка различных карт, средства формирования научной документации и т.д.).

Машинная графика применяется также в издательском деле, при моделировании, создании тренажеров, в управлении техническими системами и т.д. Для построения изображений необходимо иметь специальные технические и программные средства, называемые средствами машинной графики.


 

 

Графические возможности Delphi

 

Среда визуального программирования Delphi в полной мере предоставляет пользователю возможность разрабатывать программы, с помощью которых можно получить графические изображения: схемы, чертежи, текст и иллюстрации.

В Delphi существует ряд специальных компонентов для вывода готовых изображений (рисунков или фотографий) из графических файлов (компонент Image), некоторых геометрических фигур (компонент Shape), графиков и диаграмм (компонент Chart) и др. Например, с помощью компонента Shape (он расположен на странице Additional палитры компонентов) можно изобразить на форме круг, эллипс, квадрат, прямоугольник или прямоугольник с закругленными углами. Для этого достаточно поместить на форму компонент Shape и настроить его с помощью соответствующих свойств (свойство Shape позволяет выбрать фигуру, свойство Brush отвечает за её фоновый цвет, а свойство Pen - за толщину и цвет её границы).

Основным классом, позволяющим использовать обширные графические возможности Delphi является класс TСanvas. Этот класс имеет множество свойств и методов. Объект Canvas (канва, холст) этого класса является свойством формы и многих графических компонентов (Image, PaintBox, BitMap и др.). Он представляет собой область компонента, на которой можно рисовать или отображать готовые изображения. Канва содержит свойства и методы, существенно упрощающие графику Delphi.

Каждая точка канвы имеет координаты Х и Y. Система координат канвы, как и везде в Delphi, имеет началом левый верхний угол канвы. Координата Х возрастает при перемещении слева направо, а координата Y - при перемещении сверху вниз. Координаты измеряются в пикселах. Пиксел - это наименьший элемент поверхности рисунка, с которым можно манипулировать. Важнейшее свойство пиксела - его цвет. Для описания цвета используется тип TColor. Цвет встречается практически в каждом компоненте. В Delphi определено множество констант типа Tcolor. Одни из них непосредственно определяют цвета (например clBlue - синий), другие определяют цвета элементов окон, которые могут меняться в зависимости от выбранной пользователем палитры цветов Windows (например, clBtnFace - цвет поверхности кнопок).

Константы свойства Color

 

Константа Цвет Константа Цвет
СlBlack Черный ClSilver Серебристый
СlMaroon Каштановый ClRed Красный
СlGreen Зеленый ClLime Салатный
СlOlive Оливковый ClBlue Синий
СlNavy Темно-синий ClFuchsia Ярко-розовый
СlPurple Розовый ClAqua Бирюзовый
СlTeal Зелено-голубой ClWhite Белый
СlGray Серый    

 

У канвы имеется свойство Pen - перо. Это объект, в свою очередь имеющий ряд свойств. Одно из них - уже известное свойство Color - цвет, которым наносится рисунок. Второе свойство - Width (ширина линии). Она задается в пикселах. По умолчанию ширина линии равна 1. Третье свойство Style определяет вид линии. Это свойство может принимать следующие значения:

Константы свойства Style

 

Константа Вид линии
PsSolid Сплошная линия
PsDash Пунктирная линия, длинные штрихи
psDot Пунктирная линия, короткие штрихи
psDashDot Пунктирная линия, чередование длинного и короткого штрихов
psDashDotDot Пунктирная линия, чередование одного длинного и двух коротких штрихов
psClear Линия не отображается

 

Четвертое свойство пера - Mode определяет, как будет формироваться цвет точек линии в зависимости от цвета точек холста, через которые эта линия прочерчивается. По умолчанию вся линия вычерчивается цветом, определяемым значением свойства Pen.Color.

Ниже перечислены некоторые константы, которые можно использовать в качестве значения свойства Pen.Mode.

Константы свойства Pen.Mode

 

Константа Цвет линии
pmBlack Черный, не зависит от значения свойства Pen.Color
pmWhite Белый, не зависит от значения свойства Pen.Color
pmCopy Цвет линии определяется значением свойства Pen.Color
pmNotCopy Цвет линии является инверсным по отношению к значению свойства Pen.Color
pmNot Цвет линии определяется как инверсный по отношению к цвету точки холста, в которую выводится точка линии

 

У канвы имеется свойство PenPos типа TPoint. Это свойство определяет в координатах канвы текущую позицию пера. Перемещение пера без прорисовки линии, т.е. изменение PenPos, производится методом канвы MoveTo(X,Y). Здесь X и Y - координаты точки, в которую перемещается перо. Эта текущая точка становится исходной, от которой методом LineTo(X,Y) можно провести линию в точку с координатами (X,Y). При этом текущая точка перемещается в конечную точку линии, и новый вызов LineTo будет проводить линию из этой новой текущей точки.

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

Методы класса TCanvas

 

Метод Описание
Arc (X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer) Рисует дугу окружности или эллипса. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки.
Chord (X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer) Рисует замкнутую фигуру: дугу окружности или эллипса, замкнутую хордой. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Хорда соединяет точки (X3, Y3) и (X4, Y4).  
Ellipse (X1, Y1, X2, Y2: Integer) Рисует заполненную окружность или эллипс. Точки(X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс.
Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer) Рисует замкнутую фигуру - сектор окружности или эллипса. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сектор и проходящие через центр эллипса и точки (X3, Y3) и (X4, Y4).
Polygon (Points: array of TPoint) Рисует замкнутую фигуру (полигон, многоугольник) по множеству угловых точек, заданному массивом Points. Первая из указанных точек соединяется с последней.
Polyline (Points: array of TPoint) Рисует кусочно-линейную кривую по множеству точек, заданному массивом Points. Отличие метода Polyline от метода Polygon заключается в том, что метод Polygon замыкает конечные точки, а метод Polyline - нет. Метод не изменяет текущей позиции PenPos пера Pen.
Rectangle (X1, Y1, X2, Y2: Integer) Рисует прямоугольник, верхний левый угол которого имеет координаты (X1, Y1), а нижний правый - (X2, Y2).
RoundRect (X1, Y1, X2, Y2, X3, Y3: Integer) Рисует прямоугольник со скругленными углами, верхний левый угол которого имеет координаты (X1, Y1), а нижний правый - (X2, Y2). Углы скругляются с помощью эллипсов с шириной X3 и высотой Y3.

 

Свойство канвы Brush (кисть) определяет фон и заполнение замкнутых фигур. Brush - это объект, имеющий в свою очередь ряд свойств. Свойство Color определяет цвет заполнения. Свойство Style определяет шаблон заполнения (штриховку) и может принимать следующие значения:

 

Константы свойства Style

 

Константа Тип заполнения области
BsSolid Сплошная заливка
BsClear Область не закрашивается
BsHorisontal Горизонтальная штриховка
BsVertical Вертикальная штриховка
BsFDiagonal Диагональная штриховка с наклоном линий вперед
BsBDiagonal Диагональная штриховка с наклоном линий назад
BsCross Горизонтально-вертикальная штриховка, в клетку
BsDiagCross Диагональная штриховка, в клетку

 

Таким образом, для изображения закрашенной фигуры перед использованием соответствующего метода (Chord, Ellipse, Pie, Polygon и др.) необходимо заказать цвет и стиль её закраски (Brush.Color и Brush.Style).

Для заполнения не стандартных замкнутых областей можно использовать метод FloodFill. Он определен следующим образом:

type TfillStyle = (fsSurface, fsBorder);

procedure FloodFill(X,Y: Integer; Color: TColor; FillStyle: TFillStyle);

Точка с координатами X и Y является произвольной внутренней точкой заполняемой области, которая может иметь произвольную форму. Граница этой области определяется сочетанием параметров Color и FillStyle. Параметр Color указывает цвет, который используется при определении границы заполняемой области, а параметр FillStyle определяет, как именно по этому цвету определяется граница. Если FillStyle = fsSurface, то заполняется область, окрашенная цветом Color, а на других цветах метод останавливается. Если FillStyle = Border, то наоборот, заполняется область, окрашенная любыми цветами, не равными Color, а на цвете Color метод останавливается.

Свойство канвы Font (шрифт) определяет параметры шрифта, которым выводится текст на холсте. Эти параметры устанавливаются через его свойства. Некоторые из них приведены ниже:

Константы свойства Font

 

Свойство Назначение
Name Определяет вид (название) шрифта (Arial, Times New Roman, Courier, и т.д.)
Size Pазмер шрифта в пунктах (points). Один пункт равен 1.72 дюйма.
Style Стиль начертания символов (курсив, полужирный, подчеркнутый, перечеркнутый)
Color Цвет символов
Height Размер шрифта в пикселях

 

Для вывода текста на поверхность графического объекта используется метод TextOut. Он определен следующим образом:

procedure TextOut(X,Y: Integer; Text: String);

Строка текста Text пишется на канве, начиная с позиции с координатами (X, Y). Надпись делается в соответствии с текущими установками шрифта Font. Фон надписи определяется установками текущей кисти Brush (если нет необходимости в фоне для надписи, то перед выводом текста свойству Brush.Color нужно присвоить значение bsClear или задать цвет кисти, совпадающий с цветом поверхности, на которую выводится текст). Текущая позиция PenPos пера Pen перемещается к концу выведенного текста.

Перечисленные свойства и методы представляют далеко не все графические возможности Delphi. Однако, они покрывают около 80% потребностей, обычно возникающих при работе с графикой.

Прежде, чем перейти к примерам, необходимо сказать непосредственно о порядке создания изображения. Как отмечалось выше, канва представляет собой область, на которой можно рисовать или отображать готовые изображения. Она является свойством компонента Image, и для рисования на форму сначала помещают этот компонент, а затем на его канве с помощью указанных выше свойств и методов создают изображение - записывают код в обработчик какого-либо события, например OnPaint. Как указывалось ранее, канву имеют не только компонент Image, но и другие компоненты среды программирования, например, форма. То есть, все, что рисуется на компоненте Image, может рисоваться и непосредственно на форме.

На рисунке 1 показан пример работы графической программы. Он позволяет понять методы рисования и свойства, описанные выше.

 

 

Рис. 1 Методы и свойства рисования

 

Текст процедуры, с помощью которой нарисованы эти фигуры, линии и выведен текст, представлен ниже.

 

procedure TForm1.FormPaint(Sender: TObject);

begin

with Image1.Canvas do

 begin

Arc(10,10,90,90,90,50,10,50);                                                 //дуга (эллипса или круга)

TextOut(40,60,'Arc');                                                                                                     //текст

Brush.Color:=clBlack;                                                                                       //цвет кисти

Brush.Style:=bsCross;                                                                            //стиль закраски

Chord(110,10,190,90,190,50,110,50);           //фигура, ограниченная дугой и хордой

Font.Style:=[fsBold];                                                                                //стиль шрифта

TextOut(135,60,'Chord');

Brush.Color:=clRed;

Brush.Style:=bsBDiagonal;

Ellipse(210,10,290,50);                                                                          //эллипс или круг

Font.Style:=[fsItalic];

TextOut(230,60,'Ellipse');

Brush.Color:=clGreen;

Brush.Style:=bsDiagCross;

Pie(310,10,390,90,390,30,310,30);                                //сегмент эллипса или круга

Font.Style:=[fsUnderline];

TextOut(340,60,'Pie');

Brush.Color:=clGreen;

Brush.Style:=bsSolid;

Polygon([Point(30,150),                                                                           //многоугольник

  Point(40,130),Point(50,140),Point(60,130),Point(70,150)]);

Font.Style:=[fsBold];

Font.Color:=clRed;                                                                                    //цвет шрифта

Brush.Style:=bsFDiagonal;

TextOut(30,170,'Polygon');

PolyLine([Point(130,150),                                                        //кусочно-линейная кривая

  Point(140,130),Point(150,140),Point(160,130),Point(170,150)]);

Font.Color:=clBlue;

TextOut(130,170,'PolyLine');

Brush.Color:=clBlue;

Rectangle(230,120,280,160);                                                                 //прямоугольник

Font.Color:=clGreen;

TextOut(230,170,'Rectangle');

Brush.Color:=clFuchsia;

Brush.Style:=bsHorizontal;

RoundRect(330,120,380,160,20,20);      //прямоугольник со скругленными углами

Font.Color:=clMaroon;

TextOut(325,170,'RoundRect');

Font.Color:=clBlack;

Rectangle(10,220,120,320);

Ellipse(30,240,100,300);

Brush.Style:=bsSolid;

Brush.Color:=clSilver;

FloodFill(15,225,clBlack,fsBorder);                   //закраска замкнутой области любого

                                                                                  //цвета до границы черного цвета

Brush.Color:=clLime;

FloodFill(65,270,clWhite,fsSurface);              /закраска замкнутой области белого

     //цвета до границы любого цвета

Pen.Width:=3;                                                                                             //ширина линии

MoveTo(130,220);                                                //изменение текущей позиции пера

LineTo(285,220);                                               //линия из текущей позиции в новую

TextOut(290,210,'psSolid (

MoveTo(130,240);

Pen.Style:=psDash;

Pen.Width:=1;

LineTo(285,240);

TextOut(290,230,'psDash');

MoveTo(130,260);

Pen.Style:=psDot;                                                                                             //вид линии

Pen.Color:=clRed;                                                                                            //цвет линии

LineTo(285,260);

TextOut(290,250,'psDot');

MoveTo(130,280);

Pen.Style:=psDashDot;

Pen.Color:=clBlue;

LineTo(285,280);

TextOut(290,270,'psDashDot');

MoveTo(130,300);

Pen.Style:=psClear;

LineTo(285,300);

TextOut(290,290,'psClear');

MoveTo(130,320);

Pen.Style:=psDashDotDot;

Pen.Color:=clGreen;

LineTo(285,320);

TextOut(290,310,'psDashDotDot');

Brush.Color:=clRed;

Brush.Style:=bsSolid;

Font.Color:=clYellow;

Font.Size:=20;                                                                                       //размер шрифта

Font.Name:='Courier';                                                                                      /вид шрифта

TextOut(10,350,'ФИГУРЫ, ЗАКРАСКА И ЛИНИИ');

 end;

end;


 

 

ПОСТРОЕНИЕ ИЗОБРАЖЕНИЙ И ВЫВОД ТЕКСТА

 

Перед созданием изображения полезно мысленно разбить его на элементарные геометрические фигуры - графические примитивы, для построения каждого из которых используется соответствующий описанный выше метод. После создания изображения происходит заполнение замкнутых областей выбранным стилем и цветом. На последнем этапе в нужном месте рисунка выводится текст (см. рисунок 2).

 

Рис. 2 Создание рисунка

С помощью этих же средств можно выводить на форму и некоторые технические чертежи (см. рисунок 3).

 

 

Рис. 3 Создание чертежа

 

ВАРИАНТЫ ЗАДАНИЙ

 

Используя различные методы рисования графических примитивов (линия, прямоугольник, круг, эллипс, дуги и т.д.) и вывод текста, выполнить по аналогии с представленными выше примерами рисунок (варианты 1-16) или чертеж (варианты 17-32):

Варианты рисунков

 

Вариант Рисунок Вариант Рисунок
1 Дом 9 Жук
2 Корабль 10 Бабочка
3 Самолет 11 Кошка
4 Автомобиль 12 Заяц
5 Ракета 13 Черепаха
6 Паровоз 14 Слон
7 Автобус 15 Бегемот
8 Вагон 16 Рыба

 

Варианты чертежей

 

Вариант

Чертеж

Вариант

Чертеж


Дата добавления: 2018-05-12; просмотров: 368; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!