- •Лабораторная работа 8. Работа с графикой в Delphi
- •Необходимые теоретические сведения для выполнения работы
- •Графический инструментарий Delphi
- •1 Основа графики в Delphi
- •2 Программное рисование
- •3 Построение графиков функций. Преобразование координат
- •3.1 Вывод графика функции на экран
- •3.2 Масштабирование графика
- •3.3 Преобразование координат при построении графика
- •3.4 Порядок построения графика
- •4 Индивидуальные задания
Лабораторная работа 8. Работа с графикой в Delphi
Цель работы:
- научиться работать с графикой;
- научиться строить графики простейших функций с возможностью масштабирования;
- научиться выводить графики функций с использованием стандартной компоненты Chart;
- научиться строить графики функций, заданных в параметрическом виде;
- научиться воспроизводить эффект анимации.
Отчет должен содержать:
1) Титульный лист
2) Задание
3) Математическую модель
4) Таблицу внешних спецификаций
5) Иерархию модулей (подпрограмм)
6) Описание основных алгоритмов (словесное/блок-схема)
7) Проектирование тестов
8) Результаты тестирования (копии экрана)
Необходимые теоретические сведения для выполнения работы
(Источник: Языки программирования: конспект лекций по специальности 230400 "Информ. системы и технологии" / сост. О. И. Китаева; – Иркутск: Изд-во ИрГТУ, 2012. – 1 o=электрон. опт. диск (CD-ROM.), сс. 51-57)
Графический инструментарий Delphi
1 Основа графики в Delphi
GDI - Graphics Device Interface в Windows представляет собой интерфейс, который Windows использует для рисования 2D графики. Это хотя и медленный способ отображения графики, однако, самый простой для понимания основ. Графические функции в Delphi являются надстройками над стандартными GDI функциями Windows.
Основу графики в Delphi представляет класс TCanvas – это холст (канва) с набором инструментов для рисования. Для работы с графикой определены классы TGraphic, TPicture, TGraphicObject, TCanvas. TGraphic – это абстрактный класс для инкапсуляции различных графических форматов, поддерживаемых Windows. Наследниками этого класса являются TBitmap, TIcon, TMetafile.
Класс TPicture представляет собой полнофункциональный класс, содержащий всё необходимое для работы с готовыми изображениями, является контейнером для класса TGraphic, позволяет загружать различные графические изображения, не заботясь о формате. Методы класса определяют тип изображения по расширению имени файла. Свойство Graphic класса TPicture указывает на тип используемого графического изображения.
Классы TGraphic и TPicture содержат ограниченное количество поддерживаемых ими форматов, однако на базе TGraphic можно создавать новые классы, которые будут поддерживать другие графические форматы.
Абстрактный класс TGraphicObject является родительским по отношению к классам TFont, TBrush, TPen. Классы TFont, TBrush, TPen используются только в качестве свойств других классов.
Компонент TPaintBox используется в тех случаях, когда необходимо иметь прямоугольную область для выполнения графических операций. Использование этого компонента может быть альтернативой рисованию по канве формы, но TPaintBox не позволяет загружать готовые изображения.
2 Программное рисование
Форма и все визуальные управляющие компоненты Delphi обладают свойством Canvas. Конструктор Create создаёт экземпляр класса TCanvas со свойствами: Brush, Pen, Font, CopyMode, ClipRect, PenPos, Pixels.
Brush, Pen и Font называются инструментами для рисования.
Свойство PenPos – это текущая позиция карандаша – невидимый маркер, который задается горизонтальной PenPos.x и вертикальной PenPos.y координатами. Pixels[X,Y]: integer]:color представляет собой массив, содержащий цвета пикселей. Для доступа к отдельному пикселю достаточно указать его координаты.
Определим некоторые важные классы:
TPen. Используется для рисования простых линий. Обычно применяется для функции LineTo или при рисовании рамки для определённой фигуры (например для функции Rectangle).
TBrush. Кисть используется для заполнения области определённым цветом. Применяется в функциях Rectangle, FillRect или FloodFill.
TFont. Используется для задания шрифта, которым будет нарисован текст. Можно указать имя шрифта, размер и т.д.
TRegion. Позволяет задать регион (замкнутое пространство). Регионом может быть круг, квадрат или произвольная фигура.
Программное рисование рассмотрим на примере рисования цветка, растущего в траве.
Для рисования использованы классы TPen (Перо) и TBrush (Кисть) Изображение построено с помощью процедур Polygon (Многоугольник) и Ellipse (Эллипс). Процедуры заданы следующим образом:
procedure Polygon(Points: array of TPoint); Замкнутая ломаной линии – многоугольник задается как массив точек, последняя объявленная в массиве точка соединяется с первой и область внутри многоугольника закрашивается текущим цветом кисти.
procedure Ellipse(x1, y1, x2, y2: Integer); Эллипс вписан в прямоугольник, x1,y1 – координаты верхнего левого угла прямоугольника, x2,y2 - координаты нижнего правого угла.
Результат рисования представлен на рисунке 1.
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const a:array[1..24] of integer=(95,-12,115,-32,75,-6,95,-26,115,-6,135,-26,95,14,75,-6,115,14,135,-6,95,22,115,2);
var
Form1: TForm1;
x1,y1,x2,y2:integer;
i,k,a1,a2,b1,b2:integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
x1:=100;
y1:=100;
Refresh;
Canvas.pen.Color:=clBlack;
Canvas.Brush.Color:=$0000C400;
Canvas.Polygon([Point(x1, y1+80),Point(x1+200, y1+80),Point(x1+180, y1+60),Point(x1+170, y1+70),Point(x1+160, y1+60),Point(x1+150, y1+70)
,Point(x1+140, y1+60),Point(x1+130, y1+70),Point(x1+120, y1+60),Point(x1+110, y1+70),Point(x1+100, y1+60),Point(x1+90, y1+70),Point(x1+80, y1+60),Point(x1+70, y1+70)
,Point(x1+60, y1+60),Point(x1+50, y1+70),Point(x1+40, y1+60),Point(x1+30, y1+70),Point(x1+20, y1+60),Point(x1+10, y1+70)]);
Canvas.Polygon([Point(x1+100, y1+80),Point(x1+110, y1+80),Point(x1+110, y1+50),Point(x1+130, y1+30),Point(x1+110, y1+40),Point(x1+110, y1+10),Point(x1+105, y1-10)]);
Canvas.Brush.Color:=clYellow;
Canvas.Ellipse(x1+95,y1-15,x1+115,y1+5);
Canvas.Brush.Color:=$005B5BFF;
i:=1;
for k:=1 to 6 do
begin
Canvas.Ellipse(x1+a[i],y1+a[i+1],x1+a[i+2],y1+a[i+3]);
i:=i+4;
end;
end;
end.
Рисунок 1 - Результат выполнения программы