Работа 14. Работа с экраном в графическом режиме

Цель работы: изучение библиотеки функций управления экраном в графическом режиме, выработка умений отладки и тестирования программ с функциями.

// Программа 14.1. Демонстрация построения окон, изображения шрифтов, орнаментов заполнения фигур и типов линий.

#include <graphics.h> // функции управления экраном в графическом

// режиме

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <dos.h>

void init_graph() // инициализация графического режима

{ int gr_driver, // графический драйвер

gr_mode, // графический режим

error_code; // код ошибки

gr_driver = DETECT; // автораспознавание драйвера

initgraph(&gr_driver, &gr_mode, "c:\\bc31\\bgi");

error_code = graphresult();

if (error_code != grOk ) // ...,то произошла ошибка

printf("Ошибка инициализации графики: %s", grapherrormsg(error_code));

exit(1); // прерывание выполнения программы

} // конец init_graph()

void main()

{ int Pause = 500, // длительность просмотра кадра

X = 50, Y = 100, // координаты окна

XX = 550, YY = 450;

clrscr(); gotoxy(1,10);

printf("\n\t Нажимая любую клавишу, проследите последовательность");

printf("\n\t кадров формирования графического окна с рамкой");

getch(); // конец просмотра - нажать любую клавишу !

init_graph(); getch();

// Изобразим окно двойной рамкой с разными цветами

// путем наложения двух окрашенных прямоугольников

setfillstyle(SOLID_FILL,RED); // сплошная закраска красным цветом

bar(X-5,Y-5,XX+5,YY+5); // построение закрашенного

getch(); // прямоугольника

setfillstyle(SOLID_FILL,GREEN); // второй

bar(X,Y,XX,YY); // прямоугольник

getch();

setviewport(X+5,Y+5,XX-5,YY-5, 1); // установка графического окна

// с отсечением изображения на границах окна

setbkcolor(BLUE); // цвет фона

setcolor(WHITE); getch(); // цвет контура фигур

clearviewport(); getch(); // очистка окна

// Используемые шрифты

int Font, // тип шрифта

CharSize, // коэффициент размера символов i;

for (Font=0; Font < 5; Font++) // изменяется текущий шрифт

for (i=1; i <= 5; i++) // увеличивается изображение букв

{ clearviewport();

CharSize = 2*i;

settextstyle(Font, HORIZ_DIR, CharSize); // задание типа,
// начертания шрифта и коэффициента размера символов

settextjustify(CENTER_TEXT, CENTER_TEXT); // задание

// способа выравнивания текста

outtextxy(250,175,"АаBbC"); // вывод с заданных координат

delay(Pause); // задержка кадра для просмотра

} getch();

// Заданные орнаменты

int Pattern; // орнамент заполнения фигур

for (Pattern=0; Pattern <= 11; Pattern++)

{ clearviewport();

setfillstyle(Pattern,WHITE); // установка типа орнамента и его цвета

circle((XX-X)/2,(YY-Y)/2,YY/3); // построение окружности

// с центром в точке ((XX-X)/2,(YY-Y)/2) и с радиусом YY/3

floodfill((XX-X)/2,(YY-Y)/2, WHITE); // закрасить область,
// содержащую точку ((XX-X)/2,(YY-Y)/2) и ограниченную белой линией

delay(Pause+200);

} getch();

// Типы линий

int LineType;

clearviewport();

setwritemode(COPY_PUT); // режим записи при вычерчивании линии

for (LineType=0, i=0; LineType < 5; LineType++)

{ setlinestyle(LineType,0,1); // задание параметров линии:

// стиль, шаблон, толщина ( 1 = NORM_WIDTH, 3 = THICK_WIDTH )

line(5,15+15*i,500,15+15*i); i++; // нормальная линия

setlinestyle(LineType,0,3);

line(5,15+15*i,500,15+15*i); i++; // жирная линия

delay(Pause);

} getch();

closegraph();

}

 

// Программа 14.2. Построение в оцифрованных осях семейства // кривых y = exp(-k*x)*sin(x), k = 0.1*j, j = 1,2,...,5

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <dos.h>

#include <math.h>

// !!! Здесь поместить функцию init_graph() из программы 1

main()

{ int i, j Pause = 500, // длительность просмотра кадра

X0, Y0, // начало координат

dy; // длина отрезка оцифровки оси Y

double x, y, // текущие значения аргумента и функции

DE=0.1;

clrscr(); gotoxy(1,10);

printf("\n\t Нажимая любую клавишу, проследите последовательность");

printf("\n\t кадров формирования изображений");

getch(); // конец просмотра - нажать любую клавишу !

init_graph();

X0 = 20; Y0 = getmaxy() / 2; // центр начала координат

setbkcolor(BLACK); setcolor(WHITE);

line(X0,20,X0,getmaxy()-20); // ось Y

line(X0,Y0,getmaxx()-20,Y0); // ось Х

settextjustify(RIGHT_TEXT,CENTER_TEXT); // оцифровкa оси Y

// cправа по центру от указанной ниже точки

settextstyle(DEFAULT_FONT,VERT_DIR,1); // фонт 8х8,

// вертикальное расположение текста, коэффициент размера 1

dy = (Y0-20) / 2; // длина отрезка оцифровки оси Y

// Оцифровка оси Y

for (i = 0; i < 5; i++)

{ moveto(X0-5,20+i*dy);

switch (i)

{ case 0: { outtext("1.0"); break; }

case 1: { outtext("0.5"); break; }

case 2: { outtext("0"); break; }

case 3: { outtext("-0.5"); break; }

case 4: { outtext("-1.0"); break; }

}

} getch();

// Построение графиков

for (j = 0; j <= 5; j++) // семейство кривых

{ moveto(X0,Y0);

for ( i = 1; i < getmaxx()-40; i++) // построение кривой

{ x = i*4*M_PI/(getmaxx()-40);

y = exp(-DE*j*x)*sin(x);

lineto(X0+i, Y0-int(y*220));

} getch();

} getch();

closegraph();

}

// Программа 14.3. Построение изображения увеличивающегося

// четырехугольника: все стороны последовательно изменяются на

// увеличивающуюся величину increment.

// Просмотр изображения по нажатию клавиш:

// "Y" - предыдущие изображения сохраняются ("эффект глубины"),

// "N" - предыдущие изображения не сохраняются.

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <dos.h>

#include <math.h>

#include <ctype.h> // функция toupper() - возвращает заглавный

// эквивалент строчной буквы

// !!! Здесь поместить функцию init_graph() из программы 1

main()

{ int i, k, increment = 0, Pause = 100,

arr[10] = {310,230,330,230,330,250,310,250,310,230};

// в массиве координаты углов исходного четырёхугольника,

// координаты первой точки должны замыкать массив

char ch;

clrscr(); gotoxy(1,10);

printf("\t Для просмотра рисунка с сохранением всех изображений");

printf("\n\t нажмите клавишу Y, иначе - N");

ch = getch(); ch = toupper(ch);

init_graph();

setbkcolor(BLACK); setcolor(WHITE);

drawpoly(5,arr); // вывод исходного изображения

delay(2*Pause);

if ( ch == 'N' ) // убрать изображение цветом фона

{ setcolor(BLACK); drawpoly(5, arr); }

for (i = 1; i < 25; i++) // построение изображений

{ increment++;

for (k = 1; k < 5; k++) // последовательное увеличение сторон

// четырехугольника

{ switch ( k )

{ case 1: { arr[1] = arr[1] - increment;

arr[9] = arr[1]; break; } // вверх

case 2: { arr[2] = arr[2] + increment;

break;} // вправо

case 3: { arr[5] = arr[5] + increment;

break;} // вниз

case 4: { arr[6] = arr[6] - increment;

break;} // влево

}

setcolor(WHITE);

drawpoly(5, arr);

delay(Pause);

if ( ch == 'N') // убрать предыдущее изображение

{ setcolor(BLACK); drawpoly(5, arr); }

}

} getch(); // просмотр изображения до нажатия клавиши

closegraph();

}

 

// Программа 14.4. Изображение движущейся фигуры

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h> // прототипы функций для динамического

// распределения памяти malloc() и free()

#include <dos.h>

// !!! Здесь поместить функцию init_graph() из программы 1

main()

{ int i, size;

void *pnter; // указатель на область памяти с изображением круга

clrscr(); gotoxy(1,10);

printf("\n\t Выполнение программы необходимо сопровождать");

printf("\n\t нажатием на любую клавишу");

getch();

init_graph();

setbkcolor(BLACK);

setcolor(RED); // цвет для изображения контура круга

setfillstyle(1, RED); // заполнить круг красным цветом

circle(20, 200, 10); // рисует круг

floodfill(20, 200, RED); // закрашивает круг красным цветом

size = imagesize(10,190,30,210); // число байт, необходимых

// для сохранения прямоугольной области экрана с изображением круга

pnter = malloc(size); // выделение памяти size байт

getimage(10,190,30,210, pnter); // сохранение в буфере

// двоичного образа участка экрана с изображением круга

getch();

for (i = 1; i < 400; i++) // круг летит

{ putimage(10+(i-1), 190, pnter, XOR_PUT); // стирание

// предыдущего изображения круга

putimage(10+i, 190, pnter, XOR_PUT); // вывод изображения

delay(5);

} getch();

free(pnter); // освобождение памяти

closegraph();

}

Вопросы и упражнения

1. Как установить в программе графический режим?

2. Как можно удалить с экрана изображение линии или фигуры?

3. Составьте функцию, демонстрирующую мерцание звёзд на небе.

4. Как в программе выйти из графического режима и продолжить работу в текстовом режиме?

 


ПРИЛОЖЕНИЕ 2

Пример ОФОРМЛЕНИЯ ОТЧЁТА