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 - вниз).

CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru

Рисунок 1 - Расположение элементов изображения на экране дисплея

Введем обозначения (рис.1 и рис.2):

- Ха, Ya - координаты точки А на графике заданной функции в декартовой системе координат XOY (в общем случае Ха, Ya - вещественные числа); Ха и Ya выражены в единицах измерения аргумента и функции соответственно;

- (Xн, Хк) - область изменения аргумента; Хн < Хк;

- ХэОэYэ - система координат экрана;

- Хэ,а, Yэ,а - координаты точки А на экране (в пикселах);

- Хэ,min, Хэ,max, Yэ,min, Yэ,mах - минимальные и максимальные значения координат точек на экране; максимальные значения определяются с помощью обращения к функциям GetMaxX и GetMaxY:

ХеМах := GetMaxX;

YeMax := GetMaxY;

CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru - Хэ,н, Хэ,к, Yэ,н, Yэ,к - границы прямоугольника для вывода изображения на экран;

Хэ,min <= Хэ,н < Хэ,к <= Хэ,mах,

(1)

Yэ,min <= Yэ,н < Yэ,к <= Yэ,mах.

Для вьвода графика функции рекомендуется использовать центральную часть экрана; поясняющие надписи располагать сверху, слева и снизу. Значения Хэ,н, Хэ,к, Yэ,н, Yэ,к могут быть назначены следующим образом:

а) постоянными и равными минимальным и максимальным координатам экрана,

б) постоянными из имеющегося диапазона (1),

в) назначаемыми пользователем из диапазона (1) перед вьводом на экран и другими способами.

CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru

Рисунок 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 =...".

Перед выполнением операций вывода какой-либо информации или изображения на экран следует установить тип, толщину и цвет линии, цвет фона, цвет и шрифт символов.

CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru

Рисунок 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,

CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru код графического режима •

код видеографического устройства

{ Процедуры и функции}

function F(var x: real) : real

begin

end;

begin

write('Bведите XN, XK:'); { Ввод исходных данных }

readln(Xn, Xk); { в текстовом режиме }

write('Введите количество точек графика: ');

readln(N);

{ Вычисление Yn и Yk и шага изменения аргумента h }

{———— Инициализация графического режима ————}

grDriv := Detect;

CloseGraph - процедура. Удаляет графический драйвер из памяти и осуществляет переход в тот текстовый режим, который бьл установлен перед вызовомInitGraph - student2.ru 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, это соответствует нормальному завершению последней графической операции.

Наши рекомендации