CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph
Лабораторная работа № 7
РАЗРАБОТКА ПАСКАЛЬ-ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ГРАФИЧЕСКИХ
ПРОЦЕДУР И ФУНКЦИЙ
7.1 Цель работы
Освоение методов проектирования Паскаль-программ с использованием графических процедур и функций.
7.2 Задание на лабораторную работу
Разработать с использованием процедур и функций из стандартного модуля Graph программу, обеспечивающую вывод графика заданной функции, осей координат и поясняющего текста.
7.3 Возможности и методы модуля Graph
7.3.1 Модуль Graph представляет собой мощную библиотеку графических подпрограмм универсального назначения, рассчитанную на работу с наиболее распространенными графическими адаптерами IBM-совместимых ПК. Подпрограммы модуля Graph обеспечивают различные режимы работы многорежимных адаптеров, полностью используют их цветовые возможности и разрешающую способность.
При исполнении графических программ требуется автономный драйвер графического адаптера (BGI- файл). Если программа использует штриховые шрифты, то кроме того нужен один или несколько шрифтовых файлов (CHR- файлы). При необходимости драйвер и шрифты могут быть включены в тело программы еще на этапе компиляции.
Графические драйверы поддерживают следующие графические адаптеры (и полностью совместимые с ними):
Таблица 20
CGA | Hercules |
MCGA | AT&T 400 |
EGA | 3270 PC |
VGA | IBM-8514 |
Для поддержки этих аппаратных средств используются следующие драйверы:
Таблица 21
CGA.BGI | Драйвер для CGA, MCGA |
EGAVGA.BGI | Драйвер для EGA, VGA |
HERC.BGI | Драйвер для монохромного Hercules |
ATT.BGI | Драйвер для AT&T 6300 (400 строк) |
PC3270.BGI | Драйвер для IBM 3270 PC |
IBM8514..BGI | Драйвер для IBM 8514 |
Во время выполнения программы процедура InitGraph автоматически распознает графический адаптер, установленный на ПК, загружает и инициализирует соответствующий графический драйвер, переводит адаптер в графический режим и возвращает управление вызывающей программе. Процедура CloseGraph выгружает драйвер из памяти и восстанавливает текстовый режим работы адаптера.
Подпрограммы модуля Graph позволяют адресоваться к любому элементу (пикселю) растрового графического экрана и управлять светимостью этого элемента. Для указания пикселя используется следующая система координат: верхний левый угол графического экрана имеет координаты 0,0; горизонтальная координата X увеличивается слева направо, вертикальная координата Y увеличивается сверху вниз. Например, в режиме 640х480 (адаптер VGA) правый нижний угол экрана имеет координаты 639, 479, а центр экрана – координаты 319, 239.
Некоторые графические подпрограммы используют понятие текущего указателя. Указатель содержит координаты того пикселя, начиная с которого будет строиться изображение подпрограммы LineTo, LineRel, OutText и др. В этом смысле указатель подобен текстовому курсору, но, в отличие от него, не имеет видимого изображения на экране.
Для вывода текстовых сообщений на графический экран модуль Graph предоставляет один матричный и 4 штриховых шрифтов. Каждый символ матричного шрифта на экране реализуется в виде матрицы из 8х8 пикселей. Штриховые шрифты для каждого символа определяют набор штрихов (векторов), с помощью которых на экране создается (вычерчивается) соответствующий символ. Штриховые шрифты позволяют изменять размеры текстовых надписей в широких пределах без существенного ухудшения качества изображения символов. Однако стандартные штриховые шрифты не содержат символы кириллицы.
В модуле Graph имеется несколько процедур для рисования элементарных графических фигур – точек, линий, окружностей, дуг и т.п. При необходимости замкнутые фигуры могут быть закрашены различными цветами и стилями (образцами закраски).
Процедура SetViewPort создает на экране графическое окно. Если окно определено, весь дальнейший графический вывод осуществляется относительно координат этого окна и отсекается его границами.
В модуле имеются средства сохранения и выдачи изображений, работы с несколькими графическими страницами, установки необходимых цветов.
7.3.2 Константы
Таблица 22-Константы типов и толщины линии
Константа | Значение | Тип |
SolidLn | Сплошная | |
DottedLn | Точечная | |
CenterLn | Штрихпунктирная | |
DashedLn | Пунктирная | |
UserBitLn | Тип определяется пользователем | |
NormWidth | Нормальная толщина | |
ThickWidth | Тройная толщина |
Таблица 23-Константы управления шрифтом
Константа | Значение | Описание |
DefaultFont | Матричный шрифт 8х8 | |
TriplexFont | Шрифт триплекс | |
SmallFont | Мелкий шрифт | |
SansSerifFont | Прямой шрифт | |
GothicFont | Готический шрифт | |
- | Рукописный шрифт | |
- | Одноштриховой шрифт типа Courier | |
- | Красивый наклонный шрифт типа Times Italic | |
- | Шрифт типа Times Roman | |
- | Шрифт типа Courier увеличенного размера | |
- | Крупный двухштриховый шрифт | |
HorizDir | Горизонтальное направление | |
VertDir | Вертикальное направление | |
UserCharSize | Размер символа, определяемый пользователем | |
LeftText | Указатель слева от текста | |
CenterText | Указатель по центру текста | |
RightText | Указатель справа от текста | |
BottomText | Указатель снизу от текста | |
CenterText | Указатель по центру текста | |
TopText | Указатель сверху от текста |
7.3.3 Процедуры и функции
Таблица 24-Процедуры
Метод | Назначение |
Procedure Circle(X,Y:Intrger,R:Word) | Рисует окружность радиуса R, используя X,Y как координаты центра |
Procedure ClearDevice | Очищает экран |
Procedure ClearViewPort | Очищает окно |
Procedure CloseGraph | Закрывает графический режим |
Procedure GraphDefaults | Устанавливает стандартные параметры графического режима |
Procedure InitGraph(var Driver, Mode: Integer; Path:String) | Инициализирует графический режим. Переменные Driver и Mode должны содержать тип графического драйвера и его режим работы. Допускается указать Driver=0 для автоматического определения этих параметров по результатам тестирования аппаратуры. Параметр Path определяет маршрут поиска файла графического драйвера. |
Procedure Line(X1,Y1,X2,Y2:Integer) | Рисует линию от точки X1,Y1 до точки X2,Y2. |
Procedure LineTo(X,Y:Integer) | Рисует линию от текущего указателя к точке X,Y |
Procedure MoveTo(X,Y:Integer) | Смещает текущий указатель к точке X,Y. |
Procedure OutText(TextString: String) | Выводит текстовую строку на экран. |
Procedure OutTextXY(X,Y:Integer; TextString: String) | Выводит текст в заданное место зкрана |
Procedure PutPixel(X,Y:Integer; Color:Word) | Выводит точку цветом Color с координатами X,Y. |
Procedure Rectangle(X1,Y1,X2,Y2: Integer) | Рисует прямоугольник, используя текущий цвет и тип линий. |
Procedure SetBkColor(Color:Word) | Устанавливает цвет фона |
Procedure SetColor(Color:Word) | Устанавливает основной цвет, которым будет осуществляться рисование. |
Procedure SetGraphMode(Mode: Integer) | Устанавливает новый графический режим и очищает экран. |
Procedure SetLineStyle(LineStyle, Pattern, Thickness: Word) | Устанавливает толщину и стиль линии. |
Procedure SetTextJustify(Horiz,Vert: Word) | Устанавливает выравнивание текста, используемого в процедурах OutText и OutTextXY. |
Procedure SetTextStyle(Font,Direction, CharSize: Word) | Устанавливает текущий шрифт, стиль и размер текста |
Procedure SetViewPort(X1,Y1,X2,Y2: Integer; ClipOn: Boolean) | Устанавливает текущее окно для графического вывода. |
7.3.4 Пример использования графического режима экрана и некоторых возможностей процедур из модуля Graph представлен ниже:
Unit Zad1; {создание модуля}
Interface
Uses Crt, Graph;
Procedure z1;
Implementation
Procedure z1; {описание процедуры}
var d,ibm,i,x1,y1,x2,y2,n:integer;
s1,s2,s3,s4,s5:string;
begin
ClrScr;
d:=detect;
ibm:=ibm8514hi;
s1:=' Demonstration program';
s2:=' Interface Menu';
s3:=' By Gureev Alexey';
s4:='Borland Pascal';
s5:=' If you like it, then press any key ...';
InitGraph(d,ibm,'d:\pas\pas\bgi'); {подключение графического режима}
if graphresult<>grOK then WriteLn('error...') {проверка открытия графического режима на наличие ошибок}
else
begin
SetGraphMode(IBM); {установка режима}
ClearDevice; {очищение экрана}
SetColor(7); {установка основного цвета}
SetLineStyle(0,0,3); {установка стиля начертания линий}
Rectangle(0,0,640,480); {рисует прямоугольник}
SetLineStyle(1,0,1); {переустановка типа линий}
Rectangle(3,3,637,477);
SetTextStyle(7,0,3); {установка способа начертания, типа шрифта и его размера}
SetColor(27);
MoveTo(30,10); {перемещение курсора в определенную точку экрана}
OutText(s1); {вывод строки на экран}
MoveTo(50,70);
SetColor(54);
SetTextStyle(4,0,6);
Delay(400); {пауза в 400 миллисекунд}
OutText(s2);
MoveTo(340,350);
SetTextStyle(5,0,4);
SetColor(73);
For i:=1 to Length(s3) do begin{побуквенный вывод строки}
OutText(s3[i]);
delay(250);
end;
MoveTo(100,150);
SetColor(26);
SetTextStyle(8,1,4);
OutText(s4);
Delay(300);
SetTextStyle(2,0,5);
Repeat{вывод в виде бегущей строки}
MoveTo(250,450);
For i:=1 to Length(s5) do begin
SetColor(15);
OutText(s5[i]);
delay(15);
end;
Delay(400);
MoveTo(250,450);
For i:=1 to Length(s5) do begin
SetColor(12);
OutText(s5[i]);
delay(15);
end;
Delay(400);
Until KeyPressed;
end;
readkey;
SetColor(7);
x1:=0;y1:=0;
x2:=640;y2:=480;
n:=2;
Repeat{декоративная заливка экрана}
Rectangle(x1,y1,x2,y2);
x1:=x1+Round(n/2);y1:=y1+n;
x2:=x2-Round(n/2);y2:=y2-n;
until x1>240;
CloseGraph; {закрытие графического режима}
ReadKey;
end;
end.
Unit Zad2;
Interface
Uses Crt, Graph;
Procedure z2;
Implementation
var d,ibm,k,col,x1,y1,x2,y2,x3,y3,x4,y4,r,n,p1,p2,p3:integer;
Procedure z2;
begin
ClrScr;
Randomize; {подключение генератора случайных чисел}
d:=detect;
ibm:=ibm8514hi;
InitGraph(d,ibm,'d:\pas\pas\bgi'); {переход к графическому режиму}
if graphresult<>grOK then WriteLn('error...') {проверка на наличие ошибок}
else
begin
SetGraphMode(IBM); {установка режима}
ClearDevice; {очистка экрана}
k:=0;
Repeat
col:=Random(256);
SetLineStyle(0,0,3); {устанавливаем способ начертания линий}
x1:=Random(640);x2:=Random(640);x3:=Random(640);
y1:=Random(480);y2:=Random(480);y3:=Random(480);
x4:=Random(640);y4:=Random(480);
r:=Random(100);
SetColor(col);
Line(x1,y1,x2,y2); {вычерчивает прямую}
Line(x2,y2,x3,y3);
Line(x3,y3,x1,y1);
Delay(30); {пауза в 30 миллисекунд}
SetColor(col+1);
Rectangle(x1,y2,x4,y3); {выводит прямоугольник}
Delay(30);
SetColor(col-1);
Circle(x4,y4,r); {вычерчивает окружность}
Delay(30);
SetColor(0);
{затемнение выведенных объектов}
Line(x1,y1,x2,y2);
Line(x2,y2,x3,y3);
Line(x3,y3,x1,y1);
Rectangle(x1,y2,x4,y3);
Circle(x4,y4,r);
If k=10 then begin {вывод надписи с сопровождением звуковаго сигнала}
MoveTo(150,200);
SetColor(col+2);
SetTextStyle(3,0,4);
OutText('Information Systems');
Sound(50);
Delay(100);
NoSound;
k:=0;end;
Delay(30);
k:=k+1;
until KeyPressed;
end;
readkey;
SetColor(7);
x1:=0;y1:=0;
x2:=640;y2:=480;
n:=2;
Repeat{декоративная заливка экрана}
Rectangle(x1,y1,x2,y2);
x1:=x1+Round(n/2);y1:=y1+n;
x2:=x2-Round(n/2);y2:=y2-n;
until x1>240;
CloseGraph; {завершение работы в графическом режиме}
end;
end.
7.4 Требования к программе
Требования к программе:
- ввод данных в режиме диалога (при этом можно использовать текстовый режим),
- обработка ошибок при вводе данных и инициализации графического режима,
- вывод результатов в графической форме с использованием не менее трех цветов для оформления фона и элементов чертежа,
- вывод надписи над графиком: " График функции Y =...",
- вывод начальных и конечных значений аргумента и функции около осей координат (Хн, Хк, Yн, Yк на рис. 1).
7.5 Порядок выполнения работы
7.5.1 Спроектировать размещение текстовой и графической информации на экране, назначить координаты размещения, типы линий и цвета элементов изображения (п. 7.6).
7.5.2 Изучить структуру графической Паскаль-программы, а также графические процедуры и функции (п. 7.7).
7.5.3 Подготовить текст программы и отладить программу с использованием среды Турбо-Паскаля.
7.5.4 Оформить отчет (п. 7.10).
7.6 Размещение графической информации на экране
Перед разработкой текста программы следует спланировать расположение элементов изображения на экране:
- определить зоны для расположения графиков, текста (координаты и размеры) в соответствии с рис.1,
- задать типы и цвета линий; цвета, размеры, шрифты для текста; шаблоны (образцы) для заполнения (штриховки) областей рисунка и т.п.
Координаты точек должны быть заданы в системе координат экрана ХэОэYэ (положительное направление оси OY - вниз).
Рисунок 1 - Расположение элементов изображения на экране дисплея
Введем обозначения (рис.1 и рис.2):
- Ха, Ya - координаты точки А на графике заданной функции в декартовой системе координат XOY (в общем случае Ха, Ya - вещественные числа); Ха и Ya выражены в единицах измерения аргумента и функции соответственно;
- (Xн, Хк) - область изменения аргумента; Хн < Хк;
- ХэОэYэ - система координат экрана;
- Хэ,а, Yэ,а - координаты точки А на экране (в пикселах);
- Хэ,min, Хэ,max, Yэ,min, Yэ,mах - минимальные и максимальные значения координат точек на экране; максимальные значения определяются с помощью обращения к функциям GetMaxX и GetMaxY:
ХеМах := GetMaxX;
YeMax := GetMaxY;
- Хэ,н, Хэ,к, Yэ,н, Yэ,к - границы прямоугольника для вывода изображения на экран;
Хэ,min <= Хэ,н < Хэ,к <= Хэ,mах,
(1)
Yэ,min <= Yэ,н < Yэ,к <= Yэ,mах.
Для вьвода графика функции рекомендуется использовать центральную часть экрана; поясняющие надписи располагать сверху, слева и снизу. Значения Хэ,н, Хэ,к, Yэ,н, Yэ,к могут быть назначены следующим образом:
а) постоянными и равными минимальным и максимальным координатам экрана,
б) постоянными из имеющегося диапазона (1),
в) назначаемыми пользователем из диапазона (1) перед вьводом на экран и другими способами.
Рисунок 2
7.7 Алгоритм построения графика функции
Для получения графика требуемой функции рекомендуется следующий алгоритм построения графика функции:
1. Ввод границ изменения аргумента (Хн = А, Хк = В) и количества точек графика N. Вычисление шага изменения аргумента
h=(B-A)/N.
2. Оценка значений функции Yф,min и Yф,mах. Для линейных функций значения Ymin, Ymax находятся на границах интервала (Хн, Хк). Для нелинейных функций значения Ymin, Ymax следует найти, используя методы приближенного поиска экстремумов.
3. Определение масштаба по осям ОХ и OY соответственно:
Мх = (Хэ,к - Хэ,н) / (Хк - Хн); (2)
My =(Yэ,к - Yэ,н) / (Yф,max - Yф,min) (3)
4. Построение осей координат. Если нулевые значения аргумента и функции входят в диапазоны (Хн, Хк), (Yф,min, Yф,maх), то следует строить оси по точкам: (0, Yф,min), (О, Yф,mах) и (Хн, 0), (Хк, 0). В противном случае можно строить оси, начинающиеся в левом нижнем углу экрана (рис. 3). Нанести штрихи длиной Ds на оси ОХ и OY, отмечающие минимальное и максимальное значения аргумента и функции.
5. Задание начального значения аргумента Х = Хн; вычисление FX = f(x).
6. Преобразование координат начальной точки графика A=(X,FX) в систему координат экрана по формулам:
Ха=Ха-Хн; (4)
Yа=Yа-Yф,min; (5)
Хэ,а =X'a * mx + Хэ,н; (6)
Yэ,а=Yэ,к-Y'а*Му. (7)
В программе при выполнении вычислений следует учесть, что значения координат Хэ,а, Yэ,а должны быть целыми; вычисление Хэ,а и Yэ,а рекомендуется оформить в виде функций.
7. Перевод курсора в начальную точку графика (Хэ,а, Yэ,а).
8. Вычисление следующего значения аргумента Х = Х + h.
9. Если Х > Хк, то закончить построение графика.
10. Вычисление FX = f(х). Преобразование координат очередной точки графика (X, FX) в систему координат экрана по формулам (4,5,6,7).
11. Вычерчивание отрезка графика функции от предыдущей точки до очередной с использованием графических процедур и функций модуля Graph Турбо-Паскаля. Повторять операции пп.8 - 11, пока не выполнится условие п.9.
12. В верхней части экрана вывод текста:
"График функции Y =...".
Перед выполнением операций вывода какой-либо информации или изображения на экран следует установить тип, толщину и цвет линии, цвет фона, цвет и шрифт символов.
Рисунок 3
7.8 Рекомендации по выполнению лабораторной работы
7.8.1 Структура графической Паскаль-программы.
В настоящее время более 50 стандартных графических процедур и функций содержится в стандартном модуле Graph.tpu. Чтобы воспользоваться возможностями модуля graph.tpu, необходимо иметь компьютер, оснащенный видеоадаптером. В состав модуля Graph входит ряд программ-драйверов для наиболее распространенных видеоадаптеров: CGA, MCGA, EGA, VGA, SVGA, Hercules, AT&T, 3270 PC. Эти драйверы хранятся в файлах с расширением .BGI (Borland Graphic Interface). Для множества символов имеются файлы описаний с расширением .CHR.
Любая программа Turbo Pascal, использующая графические процедуры и функции из модуля Graph, имеет следующую типовую структуру:
program prog graph;
uses Graph, Crt,......;
var grDriv, grMod : integer,
код графического режима •
код видеографического устройства
…
{ Процедуры и функции}
function F(var x: real) : real
begin
…
end;
…
begin
write('Bведите XN, XK:'); { Ввод исходных данных }
readln(Xn, Xk); { в текстовом режиме }
write('Введите количество точек графика: ');
readln(N);
{ Вычисление Yn и Yk и шага изменения аргумента h }
…
{———— Инициализация графического режима ————}
grDriv := Detect;
InitGraph(grDriv, grMod, 'D:\TP\BGI');
{ путь к графическому драйверу)
{—-—-— Проверка успешного завершения инициализации ———)
if GraphResult <> GrOK then begin
writeln('Ошибка!!!');
{... обработка кода ошибки.....}
delay(lOOO);
exit
end;
{—————— Основная часть программы ——————}
XNE:=...; { Задание области вывода графика;}
YNE:=...; (можно вводить с клавиатуры или задавать) Xke:=...; {в программе }
Yke:=...;
Мх:=...; { Расчет масштабов )
Му:=..;
… { Установка цветов, типов линий и др.)
х:=хn; { Переход в начало графика }
x:=x+h;
while x < xk do
begin
y:=F(x);
{ Черчение отрезка прямой от предыдущей точки к }
{точке(x,у)}
end;
{ Черчение осей координат }
{Вывод текста }
repeat
until KeyPressed;
…
{———— Завершение графического режима —————)
CloseGraph
end.
7.8.2 Справочная информация по графическим процедурам и функциям
Графические процедуры и функции, включенные в модуль Graph, можно разделить на следующие группы:
- управляющие графические процедуры и функции;
- графические процедуры и функции для формирования экрана, окна, страницы ;
- графические процедуры и функции для работы с точечными изображениями;
- графические процедуры и функции для работы с графическими примитивами типа "линия";
- графические процедуры и функции для работы с дугами, фигурами, штриховкой;
- графические процедуры и функции для работы с цветом и палитрой;
- графические процедуры и функции для работы с текстом.
Управляющие графические процедуры и функции:
InitGraph (var gt,gm:integer;tpf:string)- процедура.
Инициализирует графический режим работы, код которого возвращается в переменной gm.
В переменной gt пересылается код соответствующего графического драйвера, для этого в модуле Graph.tpu определены следующие константы:
const detect = 0;
CGA=1;
MCGA=2;
EGA=3;
CGA=9;
PC3270=10;
Если перед инициализацией графического режима переменной gt присвоить значение 0, что соответствует константе Detect (см. пример раздела 7.8.1), то графический драйвер выбирается автоматически и определяется подходящий графический режим gm. Путь доступа к графическому драйверу (с расширением .BGI) должен задаваться в строковой переменной tpf. Если здесь стоит пустая строка ' ', то InitGraph осуществляет поиск в текущем каталоге.
CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph.
GraphResult - функция. Значением функции является код ошибки последней графической операции. Если значение функции равно 0, это соответствует нормальному завершению последней графической операции.