ПОСТРОЕНИЕ ИЗОБРАЖЕНИЙ И ВЫВОД ТЕКСТА
МАШИННАЯ ГРАФИКА
Машинная графика - совокупность методов и средств для преобразования данных в графическую форму представления и обратно с помощью ЭВМ.
Системы машинной графики на ПЭВМ относят к нескольким классам:
· иллюстративная графика (создание изображений, играющих роль иллюстративного материала - рисунки, схемы, эскизы);
· деловая графика (позволяет в наглядной форме отображать данные, хранимые в таблицах или базах данных, в виде графиков, диаграмм, гистограмм);
· инженерная графика (автоматизация чертежных и конструкторских работ);
· научная графика (создание и обработка различных карт, средства формирования научной документации и т.д.).
Машинная графика применяется также в издательском деле, при моделировании, создании тренажеров, в управлении техническими системами и т.д. Для построения изображений необходимо иметь специальные технические и программные средства, называемые средствами машинной графики.
Графические возможности 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 | Рыба |
Варианты чертежей
Вариант | Чертеж | Вариант | Чертеж
Мы поможем в написании ваших работ! |