
Технологии обработки информации(лекции) / Модули_лаб.работы
.pdf41
Далее приведен текст программы рисования залитых фигур. Использованы все стандартные типы заливки от 1 до 11.
Uses crt,graph; Procedure Init_Graph_Mode; Procedure figure;
begin
Setfillstyle(1,3); bar(50,50,250,100); Setfillstyle(2,3); bar(50,150,250,200);
readkey;
setcolor(14); circle(350,130,50); Setfillstyle(3,4); floodfill(350,130,14); setcolor(4); circle(450,130,50); Setfillstyle(4,14); floodfill(450,130,4); setcolor(1); circle(550,130,50); Setfillstyle(5,15); floodfill(550,130,1); readkey;
Setfillstyle(6,2); fillellipse(120,330,70,60); Setfillstyle(7,12); fillellipse(280,330,70,60); readkey;
Setfillstyle(8,9); pieslice(420,350,0,120,60); Setfillstyle(9,11); Sector(520,350,0,120,60,70);
readkey;
cleardevice; setcolor(15); Setfillstyle(10,13); Bar3D(120,120,200,400,30,TopOn); Setfillstyle(11,10); Bar3D(320,120,400,400,30,TopOff);
readkey;
end; begin
Init_Graph_Mode; figure; closegraph;
end.
При выводе графических изображений, кроме заливки (заполнения) используют понятие палитра.
2.2.9 Управление палитрой
Максимальный набор цветов, одновременно поддерживаемых драйвером BGI называется палитрой. Для дисплея VGA максимальный набор цветов равен 16 (от 0 до 15). Это программные цвета. Первоначальное размещение цветов в палитрах EGA/VGA соответствует последовательности их описания константами от Black (0) до White (15). Каждому программному цвету присваивается "аппаратный" цвет. В адаптере VGA аппаратная палитра содержит 256 цветов.
41
42
Для управления соответствием между программными и аппаратными цветами в модуле Graph предусмотрено несколько процедур, функций, типов и констант.
Для описания палитры используется константа и тип: Const
MaxColors = 15; {Максимальный программный номер цвета}
Type
Palettetype = Record
Size : byte; {Количество цветов в палитре}
Colors : Array [0..MaxColors] of ShortInt; {Массив номеров цветов} End;
Для определения палитры, которая устанавливается по умолчанию (сразу после инициализации графического режима) используется процедура:
GetDefaultPalette ( Palette);
Palette - переменная типа Palettetype. В ней содержится информация о количестве и последовательности цветов начальной палитры.
Для определения текущей палитры используется процедура:
GetPalette ( Palette);
Функция GetPaletteSize возвращает значение типа Word, показывающее число цветов, входящих в текущую программную палитру.
Следующий фрагмент программы позволяет вывести информацию о текущей палитре.
Uses grt,graph; Var s:string[4];
Palette:Palettetype; K, color:word; begin
{Инициализация графического режима}
. . .
GetPalette(Palette); {Определение текущей палитры} Str(Palette.size,s);
outtextxy(130,220,'В палитре ' + s + ' цветов'); outtextxy(130,240,' Вот эти цвета');
For k := 0 to Palette.size - 1 do {Вывод номеров цветов в палитре} begin
str(Palette.Colors[k],s);
{ Задание цвета пера по номеру цвета из текущей палитры } setcolor(Palette.Colors[k]);
outtextxy(30+k*25,260, s ); end;
for Color := 0 to Palette.Size-1 do begin
SetColor(palette.colors[Color]);
{Вывод последовательности прямых линий различными цветами текущей палитры }
42
43
Line(30, Color * 12, 430, color * 12); end; readkey;
Можно заменить один (любой) цвет в палитре на новый цвет с помощью процедуры: SetPalette(N, Color);
N - номер цвета в палитре, переменная типа Word (от 0 до 15);
Color - номер вновь устанавливаемого цвета, переменная типа ShortInt, т.е. она не может быть больше 127.
Для замены нескольких цветов в текущей палитре можно использовать процедуру SetAllPalette(Palette), где параметр Palette можно описать следующим образом:
Var Palette: Array[0..MaxColors] of ShortInt;
По нулевому адресу в этот массив должно быть записано значение, равное количеству цветов в вновь устанавливаемой палитре. Остальные элементы массива - это вновь устанавливаемые цвета. Кроме того, можно вместо номера цвета заносить -1, что будет означать, что цвет, записанный на данном месте, не
меняется. |
|
Uses graph; |
|
Var |
Mpalette:array[0..maxcolors]of shortint; |
s:string[4]; |
Palette:Palettetype; K, color, Nmax : word; |
begin |
|
{ Инициализация графического режима} |
|
. . . |
GetPalette(Palette); |
for Color := 0 to Palette.Size-1 do begin SetColor(palette.colors[Color]);
Line(30, Color * 12, 430, color * 12); end;
readkey; cleardevice;
{Действие процедуры SetAllPalette} Nmax:=GetPaletteSize; Mpalette[0]:=Nmax;
for k:=1 to Nmax do Mpalette[k]:=random(127); SetAllPalette(Mpalette);
for Color := 0 to Palette.Size-1 do begin SetColor(palette.colors[Color]);
Line(30, Color * 12, 430, color * 12); end;
readkey;
closegraph;
end.
Процедура SetRGBPalette(Color, RedVal, GreenVal, BlueVal) позволяет установить цветовую гамму, но только при работе с дисплеем IBM 8514 и адаптером VGA, использующим видеопамять объемом 256 Кбайт.
43
44
Здесь Color - переменная, задающая номер цвета (для адаптера VGA от 0 до
15); RedVal, GreenVal, BlueVal - выражения типа Integer, устанавливающие интенсивность соответственно красной, зеленой и синей составляющих цвета (в диапазоне от 0 до 256).
Программа, демонстрирующая действие процедуры SetRGBPalette выводит на экран два залитых прямоугольник (синего и белого цвета), а затем, после нажатия любой клавиши, синий прямоугольник меняет окраску.
Uses crt,graph;
var grDriver,i: Integer;
{ Здесь должна быть процедура инициализация графического режима}
begin Init_Graph_Mode;
if grDriver in [IBM8514, VGA] then begin
setfillstyle(1,1); {Установка сплошной заливки цветом 1 - синим} bar(100,100,200,400);{Рисование залитого синим, прямоугольника} setfillstyle(1,2); {Установка сплошной заливки цветом 2 - зеленым} bar(300,100,400,400);{Рисование залитого зеленым, прямоугольника} readkey;
for i:=1 to 100 do begin
{Выбор интенсивности составляющих -действует на синии фигуры} SetRGBPalette(1,Random(255),Random(255),Random(255));
end;
closegraph;
end else begin
outtextxy(300,20,'Адаптер не тот'); readkey;
end;
end.
2.2.10Вывод текста в графическом режиме
Вграфическом режиме стандартными средствами вывести на экран можно только строковые константы или переменные. Поэтому при выводе числовых значений необходимо преобразовать их в строковое с помощью процедуры преобразования типов STR(chislo, stroka).
Для вывода текстовых изображений (строк) можно использовать одну из двух процедур модуля Graph:
OutText(Строка) или OutTextXY(X, Y, Строка);
Первая из этих процедур выводит текстовую строку, начиная от текущего положения графического курсора, а вторая - с позиции, определяемой координатами (X, Y).
44
45
Текстовая информация, в графическом режиме, может быть выведена различными шрифтами, в горизонтальном и вертикальном направлении. Кроме того, можно задавать размер выводимых символов.
Однако в стандартных шрифтах, разработанных фирмой Borland, отсутствуют шрифты для вывода кириллицы, что исключает вывод русскоязычных сообщений всеми шрифтами, точечного (шрифта по умолчанию, имеющего номер 0). Для вывода кириллицы другими шрифтами необходимо иметь дисковые файлы с русскоязычными шрифтами.
Для задания стиля текстового вывода (шрифта, направления и размера) используется процедура:
SetTextStyle (Font, Direct. Size);
Font - код (номер) шрифта; Direct - направление ; Size - код размера.
Для указания кода шрифта используются константы (от 0 до 10), причем первые пять имеют также мнемоническое изображение.
Const
DefaultFont = 0; { Точечный или матричный шрифт 8 х 8} TriplexFont = 1; { Утроенный, полужирный шрифттриплекс } SmallFont = 2; { Уменьшенный шрифт - тонкое начертание} SansSerifFont = 3: { Прямой шрифт - книжная гарнитура} GothicFont = 4; { Готический шрифт}
5- { Рукописный шрифт}
6- { Одноштриховой шрифт, типа Courier}
7- { Наклонный шрифт, типа Times Italic}
8- { Шрифт типа Times Roman}
9- { Шрифт увеличенного размера типа Courier}
10- { Крупный двухштриховой шрифт}
Все шрифты, кроме 0 (стандартного) - штриховые или векторные, их достоинство - простота масштабирования.
Каждый из шрифтов, кроме 0, помещается в отдельном дисковом файле. Если вы хотите их использовать, то эти файлы необходимо скопировать в текущий каталог из подкаталога BGI, находящегося в каталоге с системой ТР.
Имена файлов со шрифтами: |
1 - trip.chr; |
2 - litt.chr; 3 - sans.chr; 4 |
- goth.chr; |
|
5 - scri.shr; 6 - simp.chr; 7 - tscr.chr; 8 |
- lcom.chr; 9 - euro.chr; 10 |
- bold.chr. |
||
Шрифт DefaultFont |
создается |
|
графическим драйвером в момент |
инициализации графического режима на основе анализа текстового шрифта. Поэтому, если ваш компьютер способен выводить кириллицу в текстовом режиме, то это будет возможно и графике.
Выводимый текст может размещаться на экране в горизонтальной или вертикальной ориентации. Ориентация задается одной из двух констант:
Const
HorizDir = 0; { Горизонтальное направление - слева направо} VertDir = 1; { Вертикальное направление - снизу вверх}
Размер шрифта задается величиной Size:
45
46
Size = от 1 до 32 для стандартного (0) шрифта и от 1 до 32 - для всех остальных. Если значение Size превышает максимально возможное, то Size устанавливается равным максимуму.
Следующая программа демонстрирует вывод текста всеми шрифтами со сменой величины size от 1 до 5.
Uses crt,graph;
var |
s,ss:string; i,j,size:word; |
{ Сюда поместить процедуру инициализации графического режима} |
|
begin |
Init_graph_Mode; |
{ Вывод текста в горизонтальном направлении} size:=0;
for j:=1 to 5 do begin
size:=size+1; { Смена размера шрифта} str(size,ss);
For i:=0 to 10 do Begin str(i,s);
settextstyle(i,0,size); { Установка стиля шрифта} outtextxy(10,10+i*35,'This is Font:' + s +' size='+ss ); end; readkey; cleardevice;
end;
{ Вывод текста в вертикальном направлении} size:=0;
for j:=1 to 5 do begin size:=size+1; str(size,ss);
For i:=0 to 10 do begin
str(i,s);
settextstyle(i,1,size);
outtextxy(10+i*45,10,'This is Font:' + s + 'size='+ss ); end; readkey; cleardevice;
end;
closegraph;
end.
Кроме описанных основных процедур для вывода текста разработаны еще несколько вспомогательных процедур и функций. Желающие могут ознакомиться с ними в [1, 2].
2.2.11Окна и страницы в графическом режиме
Вграфическом режиме, подобно текстовому, на экране можно открывать (устанавливать) прямоугольные окна. Для этого используется процедура
SetViewPort(X1, Y1, X2, Y2, Clip);
X1, Y1, X2, Y2 - координаты верхнего левого и правого нижнего углов; переменная Clip может принимать одно из двух значений: ClipOn = True или
46
47
ClipOff = False. В первом случае, содержимое экрана за пределами созданного окна отсекается (т.е. становится невидимым), а во втором - не отсекается.
Для очистки созданного графического окна используется процедура
ClearViewPort.
Для определения координат текущего графического окна используется процедура GetViewSettings(ViewInfo), где ViewInfo - переменная типа
ViewPortType, описанного в модуле Graph: Type
ViewPortType = Record
X1, Y1, X2, Y2 : Integer; Clip : Boolean;
End;
Некоторые адаптеры, в том числе VGA, EGA, поддерживают многостраничную работу. Нумерация страниц начинается с нулевой.
Вывод производится на так называемую активную страницу. Процедура SetActivePage(Num) делает активной страницу с номером, задаваемым переменной типа word - Num. Если при инициализации вы используете автоопределение графического драйвера (detect), то устанавливается режим работы с максимально возможным номером. Для обеспечения работы с двумя страницами нужно уменьшить номер режима, воспользовавшись процедурой
SetGraphMode(Gr_Mode-1). Gr_Mode - переменная, задающая режим в вызове процедуры InitGraph.
Для просмотра какой-либо страницы необходимо сделать ее активной с помощью процедуры SetVisualPage(Num). Num - номер активной страницы.
Пример работы с двумя страницами иллюстрирует следующая программа. В ней на страницу с номером 0 выводится залитый прямоугольник и сообщение о том, что это нулевая страница, а на первую страницу выводится залитый эллипс.
Uses CRT, Graph; |
|
Var Gr_Driver, Gr_Mode : Integer; |
Xc, Yc :integer; |
Begin |
|
Gr_driver:=Detect; InitGraph(Gr_Driver, Gr_Mode, ''); SetGraphMode(Gr_Mode-1); {Уменьшение номера режима для
обеспечения возможности доступа к нулевой странице} SetFillStyle(1,14); {Установка стиля заливки}
Xc:= GetMaxX div 2; Yc:= GetMaxY div 2; {Координаты центра экрана} {Вывод на 0 страницу}
Bar(Xc-200, Yc-90, Xc+200, Yc+90); Setcolor(1);
OuttextXY(Xc-50,Yc,' Page 0 - Press enter');
SetActivePage(1); |
{Активизация страницы 1} |
{Вывод на 1 страницу} |
|
SetFillStyle(1,7); |
{Установка стиля заливки} |
FillEllipse(Xc, Yc, 200,100);
OuttextXY(Xc-50,Yc,' Page 1 - Press enter');
47
48
{Просмотр страниц}
Readln; SetVisualPage(1); Readln; SetVisualPage(0); Readln;
CloseGraph;
End.
2.2.12 Сохранение и выдача изображений. Создание движущихся изображений
Для того, чтобы заставить изображения перемещаться по экрану, необходимо:
1.Определить размер памяти для хранения этого изображения c помощью функции ImageSize(X1, Y1, X2, Y2), возвращающей результат типа Word. X1, Y1, X2, Y2 - координаты верхнего левого и нижнего правого углов прямоугольника, охватывающего это изображение. Например: Size:= ImageSize(x1,y1,x2,y2);
2.Определить адрес участка динамической памяти, где будет сохранено это прямоугольное изображение размером Size, с помощью процедуры GetMem(P,Size). P - переменная типа Pointer, содержащая определенный адрес.
3.Сохранить копию этого фрагмента в динамической памяти с помощью процедуры GetImage(X1, Y1, X2, Y2, P^).
4.Вывести сохраненное изображение на экран в заданном месте с помощью процедуры PutImage(Х, Y, P^, M). X, Y - координаты левого верхнего угла того места на экране, в которое необходимо поместить копию изображения. Копия изображения должна полностью помещаться на экране, иначе она не будет выведена и экран останется без изменений. М - способ копирования, определяющий способ взаимодействия вновь размещаемой копии с уже имеющимся на экране изображением. Переменная М может принимать значения следующих констант:
Const
NormalPut = 0; {Замена существующего изображения на копию} XorPut = 1; {Исключающее ИЛИ}
OrPut = 2; {Объединительное ИЛИ} AndPut = 3; {Логическое И}
NotPut = 4; {Инверсия изображения}
Чаще всего для создания движущихся изображений на экране используют значения M, равные 0, 1 и 4.
Следующая программа демонстрирует пример создания движущихся изображений.
Uses crt,graph;
Var Size,i:word; p:pointer; procedure init_graph;
var grDriver: Integer; grMode: Integer; ErrCode:Integer; begin
grDriver := Detect;
48
49
InitGraph(grDriver, grMode,''); ErrCode := GraphResult;
if ErrCode <> grOk then
Writeln('Ошибка инициализации графического режима:' , GraphErrorMsg(ErrCode));
end; begin
init_graph;
{Рисуем колобка}
setbkcolor(7); setcolor(4); setfillstyle(1,15); circle(100,100,50); floodfill(101,101,4); setfillstyle(1,1); circle(80,80,10); circle(120,80,10); floodfill(80,80,4); floodfill(120,80,4); fillellipse(100,100,5,10); fillellipse(70,150,30,10);
fillellipse(130,150,30,10); setfillstyle(1,12); fillellipse(100,130,20,10); {Определяем объем памяти, необходимый для хранения изображения} size:=ImageSize(35,45,165,165);
GetMem(p,size); {Определение адреса начала участка в динамической области памяти, где будет храниться изображение}
GetImage(35,45,165,165,p^); { Размещение копии изображения в динамической памяти }
readkey;
{Вывод движущегося изображения} for i:=0 to 225 do PutImage(35+i,45+i,p^,0);
readkey;
{Вывод движущегося изображения в 5 раз быстрее} for i:=1 to 45 do
PutImage(35+i*5,45+i*5,p^,0); readkey; Closegraph;
end.
Лабораторная работа № 3.4 (18)
Разработка программ с использованием процедур и функций модуля
Graph (часть 2)
Цель работы:
1.Изучение процедур и функций модуля Graph.
2.Разработка программ с использованием модуля Graph.
Варианты заданий
Вариант 1
1. Построить залитый прямоугольник с координатами х1 = 20, y1 = 20,
49

50
x2 = maxx-20, y2 = maxy-20, maxx, maxy - размеры экрана (тип заливки - 5, цвет -
красный).
2.Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом.
3.На каждой из построенных фигур указать площадь, предварительно
их вычислив.
4.Изменить цвет красный в палитре на цвет синий, используя процедуру
SetPalette.
5.Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран.
6.Нарисовать залитые сектор, многоугольник, круг, подписать их
названия, используя шрифты различного размера.
7.Очистить экран.
8.Разделить экран на две части, для чего провести диагональ из левого верхнего угла.
9.В верхней половине вывести текст "How do you do" различными шрифтами
иразных размеров (начиная с самого большого) в горизонтальном
направлении, а в нижней - в вертикальном.
10.Очистить экран.
11.Нарисовать изображение, движущееся из левого, верхнего угла экрана вертикально вниз.
Вариант 2
1.Построить залитый прямоугольник с координатами х1=25, y1=25, x2=maxx-25, y2=maxy-25, где maxx, maxy - размеры экрана (тип заливки - 4, цвет - желтый).
2.Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, закрашенных различными типами заливки и различным цветом.
3.На каждой из построенных фигур указать площадь, предварительно их вычислив.
4.Изменить цвет yеlloy в палитре на цвет blue, используя про-
цедуру SetPalette.
50