
Лаб по С и С++ / Лаб_С_№16
.doc/* ЛАБОРАТОРНАЯ РАБОТА 10 ГРАФИКА (GRAFIC)
Основные функцииinitgraph - инициализация графической системы closegraph - выход из графики
graphresult - контроль правильности выполнения графической функции (0 - верно)
grapherrormsg - описание ошибки при неверном выполнении функции
setviewport - установить графическое окно
getmaxx - максимальное значение по оси х
getmaxy - максимальное значение по оси y
getx - текущее значение х
gety - текущее значение y
moveto - установить курсор в позицию x, y
moverel - сместить текущую позицию курсора на вектор (x,y)
clearviewport - очистить текущее окно
cleardevice - очистка текущей страницы
getmaxcolor - максимальное значение цвета
setbkcolor - установить цвет фона
setcolor - установить значение рисующего цвета
getpixel - чтение пикселя
putpixel - запись пикселя
imagesize - определить размер памяти для сохранения фрагмента страницы
getimage - сохранить в памяти прямоугольный фрагмент страницы
putimage - восстановить на странице сохраненный фрагмент
line - вычертить линию между двумя точками
linerel - вычертить линию от текущей точки до другой, указанной как приращение относительно текущей
lineto - вычертить линию от текущей точки до другой, указанной явно
rectangle - вычертить прямоугольник по координатам верхнего и нижнего углов
drawpoly - ломанная линия, соединяющая последовательно ряд точек
circle - окружность по радиусу и координатам центра
arc - дуга окружности
ellipse - дуга эллипса
setlinestyle - установка вида линии
bar - заполненный прямоугольник
bar3d - заполненный параллелепипед
fillpoly - заполненный замкнутый многоугольник
fillellipse - заполненный эллипс
pieslice - заполненный круговой сектор
sector - заполненный эллиптический сектор
floodfill - заполнение области, замкнутый контур которой уже существует
setfillstyle - вид (шаблон и цвет) заполнения
settextstyle - инициализация знакогенератора
settextjustify - расположение выводимых строк
outtext - вывести текст относительно текущей опорной точки
outtextxy - вывести текст относительно опорной точки x,y.
ПРИМЕРЫ
Пример 1.
/* Графические примитивы, контурные фигуры.
Пока не нажата клавиша программа рисует случайные линии,
прямоугольники и окружности. */
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
int gdriver=DETECT,gmode,errorcode,wr,x,y;
/* инициализация графики, драйвер в тек.каталоге*/
initgraph(&gdriver,&gmode,"");
/* проверка правильности инициализации */
errorcode=graphresult();
if (errorcode !=grOk)
{
printf("ошибка:%s\n",grapherrormsg(errorcode));
printf("нажмите клавишу для возврата.");
getch();
exit(1);
}
/* максимальные значения x,y */
x=getmaxx();y=getmaxy();
randomize();
while(!kbhit()) /* пока не нажата клавиша */
{
switch(random(3)) /* возможные значения 0,1,2 */
{
case 0: /* рисует линию */
line(random(x),random(y),random(x),random(y));
break;
case 1: /* рисует прямоугольник */
rectangle(random(x),random(y),random(x),random(y));
break;
case 2: /* рисует окружность */
circle(random(x),random(y),random(y/2));
break;
}
delay(100); /* временная задержка */
}
delay(800);
getch();
closegraph (); /* выход из графики */
return 0;
}
Пример 2.
/* Графические примитивы, площадные фигуры. На экране рисуется заполненный эллипс */
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int midx, midy;
int radius = 100;
/* инициализация графики */
initgraph(&gdriver, &gmode, "");
/* проверка правильности инициализации */
errorcode = graphresult();
if (errorcode != grOk) /* ошибка */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
midx = getmaxx() / 2; /* поиск центра экрана */
midy = getmaxy() / 2;
setbkcolor(15); /* цвет фона */
setcolor(1); /* рисующий цвет */
/* нарисовать эллипс с установленным заполнением */
setfillstyle(1,4);
fillellipse(midx, midy, 100,50);
/* выход из графики */
getch();
closegraph();
return 0;
}
Пример 3.
/* вывод текста разными шрифтами разным размером */
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
/* названия шрифтов */
char *fname[] = { "DEFAULT font",
"TRIPLEX font",
"SMALL font",
"SANS SERIF font",
"GOTHIC font"
};
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int style, midx, midy;
int size = 1;
/* инициализация графики */
initgraph(&gdriver, &gmode, "");
/* проверка правильности инициализации */
errorcode = graphresult();
if (errorcode != grOk) /* ошибка */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
midx = getmaxx() / 2; /* поиск центра экрана */
midy = getmaxy() / 2;
/* местоположение текста относительно опорной точки */
settextjustify(CENTER_TEXT, CENTER_TEXT);
/* перебор шрифтов */
for (style=DEFAULT_FONT; style<=GOTHIC_FONT; style++)
{
cleardevice(); /* очистка видеостраницы */
size++ ; /* увеличение размера текста */
/* выбор режима знакогенератора */
settextstyle(style, HORIZ_DIR, size);
/* вывод сообщения */
outtextxy(midx, midy, fname[style]);
getch();
}
/* выход из графики */
closegraph();
return 0;
}
Пример 4.
/* Движение объекта.
рисуется картинка скачущего мячика, высота подъема уменьшается и он останавливается. Выводится горизонтальная и вертикальная надписи. */
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
void main(void)
{
int *arrow;
int x,y,RADIUS=30,maxy,step,size,maxx,r;
int graphdriver=DETECT,gmode,errorcode;
initgraph(&graphdriver,&gmode,"");
errorcode=graphresult();
if (errorcode != grOk)
{
printf("ОШИБКА ГРАФИКИ:%s\n",grapherrormsg(errorcode));
printf("нажмите клавишу\n");
getch();
exit(1);
}
maxy=getmaxy();
maxy=maxy/RADIUS*RADIUS;
maxx=getmaxx();
x=getmaxx()/2;
y=RADIUS;
r=80;
setcolor(RED);
setbkcolor(14);
circle(x,y,RADIUS); /* рисуем окружность */
setfillstyle(SOLID_FILL,RED); /* режим заполнения */
floodfill(x,y,RED); /* заполнение окружности */
/* определение размера сохраняемой области ( мячика ) */
size=imagesize(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS);
arrow=malloc(size); /* выделение памяти */
/* сохраняем картинку мячика в памяти */
getimage(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS,arrow);
step=RADIUS;
cleardevice(); /* очистка страницы */
line(0,maxy+1,maxx,maxy+1); /* рисуем пол */
settextstyle(TRIPLEX_FONT,0,4); /* установка шрифта */
outtext("прыгает мячик"); /* вывод текста */
settextstyle(TRIPLEX_FONT,1,4);
outtextxy(5,100,"по полу");
while(! kbhit()) /* мячик прыгает сколько хотим */
{ /* или по концу движения */
sound(20000); /* сопровождается звуком */
/* вывод мячика в нужную точку */
putimage (x-RADIUS,y,arrow,XOR_PUT);
delay(125); /* временная задержка */
/* второй раз примененная функция с XOR_PUT
стирает выведенный образ */
putimage (x-RADIUS,y,arrow,XOR_PUT);
if(y>=maxy-2*RADIUS)
step=-RADIUS;
if(y<=r&&step<0) /* снижение верхнего уровня */
{ /* движения (затухание скачков) */
r+=50;
step=RADIUS;
}
y+=step;
if (r>=maxy) /* мяч остановился */
break;
nosound();
}
/* вывод изображения мяча на полу */
putimage (x-RADIUS,y-RADIUS,arrow,XOR_PUT);
getch();
free(arrow);
closegraph();
}
/* ЗАДАНИЕ
Нарисовать указанный рисунок в цветном изображении (с заполнением изображенных фигур), сохранить в памяти объект, очистить видеостраницу, имитировать движение объекта в указанных направлениях, сопровождая его горизонтальными и вертикальными надписями.
Вариант 1
Нарисовать дом. При нажатии определенных клавиш зажигается (гасится) свет, струится (или нет) дым из трубы.
Вариант 2
Изобразить на экране змейку, которая бегает по экрану.
Вариант 3
Шарик катится по полу от стенки к стенке пока не нажата клавиша.
Вариант 4
Нарисовать на экране песочные часы с сыплющимся песком. Когда последняя песчинка упадет, вывести надпись: прошло ххх секунд. Перевернуть песочные часы. Процесс продолжается, пока не нажата клавиша. Предоставить пользователю возможность установить часы в нужное место экрана перед тем, как начнется отсчет времени.
Вариант 5
Космический объект на звездном небе движется влево, вправо, вверх, вниз, по диагоналям.
Вариант 6
Нарисовать три параллелепипеда, заполненные различным образом. По желанию пользователя движение любого из них.
Вариант 7
Нарисовать три шарика и изобразить их движение на ветру.
Вариант 8
Нарисовать автомобиль, движение влево, вправо.
Вариант 9
Нарисовать дорогу, автомобиль (условно). Управлять движением автомобиля по дороге с учетом изгибов дороги.
Вариант 10
Нарисовать человечка и изобразить движение (например, машет руками).