ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
(ГОУВПО «ВГТУ»)
Кафедра конструирования и производства радиоаппаратуры
ОТЧЕТ
О выполнении лабораторных работ №6-11 курса информатики
Выполнил: студент гр. РК-081
Вырыпаев М.О.
Проверил: Хорошилов В.Н.
Воронеж 2009
1 Лабораторная работа №6
Организация графического интерфейса и построение графиков в языке Pascal с помощью модуля Graph
Цель: Научиться организовывать графический интерфейс и строить графики в языке Pascal помощью модуля Graph.
1.1 Домашнее задание
Модуль Graph представляет собой мощную библиотеку графических подпрограмм универсального назначения, расчитанную на работу с наиболее распространёнными графическими адаптерами IBM – совместимых ПК. Подпрограммы модуля Graph обеспечивают различные режимы работы многорежимных адаптеров, полностью используют их цветовые возможности и разрешающую способность.
При исполнении графических программ требуется автономный драйвер графического адаптера (BGI – файл). Если программа использует штриховые шрифты, то кроме того нужен один или несколько шрифтовых файлов (CHR – файлов). При необходимости драйвер и шрифты могут быть включены в тело программы ещё на этапе компиляции.
Во время выполнения программы процедура InitGraph автоматически распознаёт графический адаптер, установленный на ПК, загружает и инициализирует соответствующий графический драйвер, переводит адаптер в графический режим и возвращает управление вызывающей программе. Процедура CloseGraph выгружает драйвер из памяти и восстанавливает текстовый режим работы адаптера.
Подпрограммы модуля Graph позволяют адресоваться к любому элементу (пикселю) растрового графического экрана и управлять светимостью этого элемента. Для указания пикселя используется следующая система координат: верхний левый угол графического экрана имеет координаты 0,0; горизонтальная координата X увеличивается слева направо, вертикальная координата Y увеличивается сверху вниз.
Некоторые графические подпрограммы используют понятие текущего указателя. Указатель содержит координаты того пикселя, начиная с которого будет строиться изображение подпрограммами LineTO, LineRel, OutText и др. В этом смысле указатель подобен текстовому курсору, но, в отличии от него, не имеет видимого изображения на экране.
Для вывода текстовых сообщений на графический экран модуль Graph предоставляет один матричный и 4 штриховых шрифтов. Каждый символ матричного шрифта на экране реализуется в виде матрицы из 8х8 пикселей. Штриховые шрифты для каждого символа определяют набор штрихов (векторов), с помощью которых на экране создаётся (вычерчивается) соответствующий символ. Штриховые шрифты позволяют изменять размеры текстовых надписей в широких пределах без существенного ухудшения качества изображения символов. Однако стандартные штриховые шрифты не содержат символы кириллицы.
В модуле Graph имеется несколько процедур для рисования элементарных графических фигур – точек, линий, окружностей, дуг и т. п. При необходимости замкнутые фигуры могут быть закрашены различными цветами и стилями.
Процедура SetViewPort создаёт на экране графическое окно. Если окно определенно, весь дальнейший графический вывод осуществляется относительно координат этого окна и отсекает его границами.
В модуле имеются средства сохранения и выдачи изображений, работы с несколькими графическими страницами, установки необходимых цветов.
Лабораторные задания.
1. Построить графический интерфейс с помощью модуля граф, который бы состоял из 2-х пунктов меню (Выполнить, Выход). При нажатии на клавиш вверх и вниз (коды клавиш #72 и #80 соответственно) должен происходить поочередный выбор одного из пунктов меню (Выполнить, Выход). При нажатии клавиши Esc (код клавиши #27) должен происходить выход из программы. При нажатии клавиши Enter (код клавиши #13) если активно меню «Выход», то должен произойти выход из программы, если активно меню «Выполнить», цвет этого меню должен поменяться от 1 до 15 c небольшой задержкой.
Построить в координатных осях график функции (sin (x/2))² с шагом 0.1 и в промежутке от (-2;2).
Program Grafik;
uses crt, graph;
const x0=320;
y0=240;
Dx=1.55;
Dy=1;
delDx=50;
delDy=50;
var
y,x:real;
ky,kx:real;
GD, GM:integer;
ch: char;
TekDeystvie,i,X1,Y1: integer;
s:String;
BEGIN
GD:=Detect;
initGraph(GD,GM,' ');
TekDeystvie:=1;
setColor(Red);
OutTextXY(40,40,'vipolnite');
setColor(Blue);
OutTextXY(560,440,'vixod');
repeat
ch:=ReadKey;
case ch of
#13:Begin
case TekDeystvie of
1:begin
setColor(7);
line (320,16,320,450);
line (80,240,560,240);
line (315,25,320,15);
line (x0,15,325,25);
line (550,235,560,240);
line (560,240,550,245);
For i:=-2 to 2 Do
Begin
line (x0+i*delDx,y0-5,x0+i*delDx,y0+5);
str(i,s);
OutTextXY(x0+i*delDx+3,y0+15,s);
line (x0-5,y0+i*delDy,x0+5,y0+i*delDy);
str(-i,s);
OutTextXY(x0+15,y0+i*delDy+3,s);
End;
Setcolor(Green);
x:=-6.2;
y:=sin(x/2)*sin(x/2);
ky:=delDy/Dy;
kx:=delDx/Dx;
X1:=x0+trunc(x*kx);
Y1:=Y0-trunc(y*ky);
Moveto(X1,Y1);
Setcolor(Green);
Repeat
x:=x+0.1;
y:=sin(x/2)*sin(x/2);
ky:=delDy/Dy;
kx:=delDx/Dx;
X1:=x0+trunc(x*kx);
Y1:=Y0-trunc(y*ky);
LineTo (X1,Y1);
Until x>6.2;
end;
2:begin
ch:=#27;
end;
end;
end;
#80:begin
case TekDeystvie of
1:begin
TekDeystvie:= TekDeystvie+1;
setColor(15);
OutTextXY(40,40,'vipolnite');
setColor(7);
OutTextXY(560,440,'vixod');
end;
2:begin
TekDeystvie:=1;
setColor(7);
OutTextXY(40,40,'vipolnite');
setColor(Red);
OutTextXY(560,440,'vixod');
end;
end;
end;
#72:begin
case TekDeystvie of
1:begin
TekDeystvie:= TekDeystvie+1;
setColor(7);
OutTextXY(40,40,'vipolnite');
setColor(7);
OutTextXY(560,440,'vixod');
end;
2:begin
TekDeystvie:=1;
setColor(7);
OutTextXY(40,40,'vipolnite');
setColor(15);
OutTextXY(560,440,'vixod');
end;
end;
End;
end;
Until ch=#27;
CloseGraph;
END.
2. Реализовать в предыдущем задании возможность изменения масштаба.
Program Grafik;
uses crt, graph;
const x0=320;
y0=240;
Dx=1.55;
Dy=1;
delDx=50;
delDy=50;
var
y,x:real;
ky,kx:real;
GD, GM:integer;
ch: char;
TekDeystvie,X1,Y1,i,rk: integer;
s:String;
BEGIN
write('vvedite znachenie rk 1 ili 3, esli rk=1 to mashtab=0.5'); readln (rk);
GD:=Detect;
initGraph(GD,GM,' ');
TekDeystvie:=rk;
setColor(Red);
OutTextXY(40,40,'vipolnite');
setColor(Blue);
OutTextXY(560,440,'vixod');
setColor(Blue);
OutTextXY(500,400,'mashtab 0.5');
repeat
ch:=ReadKey;
case ch of
#13:Begin
case TekDeystvie of
3:begin
setColor(7);
line (320,16,320,450);
line (80,240,560,240);
line (315,25,320,15);
line (x0,15,325,25);
line (550,235,560,240);
line (560,240,550,245);
For i:=-5 to 5 Do
Begin
line (x0+i*delDx ,y0-5,x0+i*delDx ,y0+5);
str(i,s);
OutTextXY(x0+i*delDx +3,y0+15,s);
line (x0-5,y0+i*delDy ,x0+5,y0+i*delDy );
str(-i,s);
OutTextXY(x0+15,y0+i*delDy +3,s);
End;
Setcolor(Green);
x:=-6.2;
y:=sin(x/2)*sin(x/2);
ky:=delDy/Dy;
kx:=delDx/Dx;
X1:=x0+trunc(x*kx);
Y1:=Y0-trunc(y*ky);
Moveto(X1,Y1);
Setcolor(Green);
Repeat
x:=x+0.1;
y:=sin(x/2)*sin(x/2);
ky:=delDy/Dy;
kx:=delDx/Dx;
X1:=x0+trunc(x*kx);
Y1:=Y0-trunc(y*ky);
LineTo (X1,Y1);
Until x>6.2;
end;
1:begin
setColor(7);
line (320,16,320,450);
line (80,240,560,240);
line (315,25,320,15);
line (x0,15,325,25);
line (550,235,560,240);
line (560,240,550,245);
For i:=-10 to 10 Do
Begin
line (x0+i*delDx div 2 ,y0-5,x0+i*delDx div 2,y0+5);
str(i,s);
OutTextXY(x0+i*delDx +3,y0+15,s);
line (x0-5,y0+i*delDy div 2,x0+5,y0+i*delDy div 2);
str(-i,s);
OutTextXY(x0+15,y0+i*delDy+3,s);
End;
Setcolor(Green);
x:=-6.2;
y:=sin(x/2)*sin(x/2);
ky:=delDy/Dy;
kx:=delDx/Dx;
X1:=x0+trunc(x*kx);
Y1:=Y0-trunc(y*ky);
Moveto(X1,Y1);
Setcolor(Green);
Repeat
x:=x+0.1;
y:=sin(x/2)*sin(x/2);
ky:=delDy/Dy;
kx:=delDx/Dx;
X1:=x0+trunc(x*kx);
Y1:=Y0-trunc(y*ky);
LineTo (X1,Y1);
Until x>6.2;
end;
2:begin
ch:=#27;
end;
end;
end;
#80:begin
case TekDeystvie of
1:begin
TekDeystvie:= TekDeystvie+1;
setColor(15);
OutTextXY(40,40,'vipolnite');
setColor(7);
OutTextXY(560,440,'vixod');
setColor(7);
OutTextXY(500,400,'mashtab 0.5');
end;
2:begin
TekDeystvie:=1;
setColor(7);
OutTextXY(40,40,'vipolnite');
setColor(Red);
OutTextXY(560,440,'vixod');
setColor(11);
OutTextXY(500,400,'mashtab 0.5');
end;
end;
end;
#72:begin
case TekDeystvie of
1:begin
TekDeystvie:= TekDeystvie+1;
setColor(7);
OutTextXY(40,40,'vipolnite');
setColor(7);
OutTextXY(560,440,'vixod');
setColor(7);
OutTextXY(500,400,'mashtab 0.5');
end;
2:begin
TekDeystvie:=1;
setColor(7);
OutTextXY(40,40,'vipolnite');
setColor(15);
OutTextXY(560,440,'vixod');
setColor(12);
OutTextXY(500,400,'mashtab 0.5');
end;
end;
End;
end;
Until ch=#27;
CloseGraph;
END.
Вывод: Научились организовывать графический интерфейс и строить графики в языке Pascal помощью модуля Graph.