Работа 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
Пример ОФОРМЛЕНИЯ ОТЧЁТА