3. Исследование видеосистемы (графический режим)
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
отчЁт
по лабораторной работе №3 (вариант 7)
по дисциплине «Организация ЭВМ и систем»
Тема: Исследование видеосистемы (графический режим)
Студент гр. 9300 |
ФИО |
Преподаватель |
Лебедев С. В. |
Санкт-Петербург
2020
Цель работы.
Изучить работу с видеосистемой в графическом режиме, освоить использование графической библиотеки <graphics.h>.
Задание.
Написать программу, выводящую график функции на и её максимальное значение на этом интервале в отдельном окне на экране.
Краткие сведения.
Видеосистемы ПЭВМ.
Изображение на экране формируется видеоадаптером из пикселов, количество которых может быть различно для разных типов адаптера. В самом общем виде видеоадаптер состоит из двух основных частей: контроллера и видеопамяти. Память, необходимая для хранения одного образа экрана, называется видеостраницей. Объём видеопамяти и число возможных страниц, зависит от конкретного адаптера. Управление параметрами видеосистемы может выполняться на уровне портов видеоадаптера или обращением к функциям BIOS. Режимы работы видеоадаптеров можно объединить в две группы: текстовые и графические. Переключение из текстового режима в графический и наоборот означает полное изменение логики работы видеоадаптера с видеобуфером.
Графический режим работы ПЭВМ.
При работе в графическом режиме появляется возможность управлять цветом любой телевизионной точки экрана или пиксела. Число строк пикселов и число пикселов в каждой строке зависит от режима работы видеоадаптера. Таким образом, экран в графическом режиме представляет собой матрицу пикселов.
Функции обслуживания графического режима.
Функции помещены в файле <graphics.h>.
initgraph(int* gdriver, int* gmode, char* pathtodriver);
Выполняет инициализацию графической модели.
closegraph();
Освобождает память, распределённую под драйверы графики, файлы шрифтов и промежуточные данные и восстанавливает режим работы адаптера в состояние, в котором он находился до выполнения инициализации системы.
detectgraph(int* graphdriver, int* graphmode);
Определяет тип активного видеоадаптера системы и тип подключённого монитора в персональном компьютере.
int graphresult();
Возвращает значение внутреннего кода ошибки, установленного последним обращением к функциям графической библиотеки.
char * grapherrormsg(int errorcode);
Возвращает указатель на ASCII-строку символов, содержащую сообщение об ошибке, соответствующее внутреннему коду ошибки errorcode функций графики Turbo С.
int getgraphmode();
Возвращает текущий графический режим, установленный для графической модели функциями initgraph() или setgraphmode().
int getmaxmode();
Возвращает число, определяющее максимально возможный для инсталлированного .BGI-драйвера режим.
int getmaxx(); int getmaxy();
Возвращают максимальные значения координат X и Y для текущего видеорежима.
char* getmodename(int mode_number);
Возвращает указатель на ASCII-строку символов, содержащую имя символической константы, соответствующей режиму mode_number.
setgraphmode(int mode);
Устанавливает видеосистему в режим, заданный значением переменной mode, и сбрасывает значения внутренних переменных системы графики в их значения по умолчанию (стиль линий, маска заполнения, шрифт и т.д.).
restorecrtmode();
Возвращает видеоадаптер в режим, в котором он был до выполнения инициализации системы графики.
int getbkcolor();
Возвращает целое число, равное коду цвета фона.
int getmaxcolor();
Возвращает макс. значение кода цвета пиксела минус 1.
setbkcolor(int color);
Устанавливает новый цвет пикселов, имеющих код цвета 0. Новый цвет фона задаёт значение аргумента color.
setcolor(int color);
Устанавливает цвет, используемый функциями графического вывода в значение, заданное аргументом color.
getviewsettings(struct viewporttype *viewport)
Заполняет поля структурной переменной по шаблону viewporttype информацией о графическом окне.
setviewport (int left, int top, int right, int bottom, int clip);
Описывает новое графическое окно с координатами (столбец, строка) левого верхнего угла left, top, координатами правого нижнего угла right, bottom и значением флага усечения clip.
int getx(); int gety();
Возвращают текущие координаты X и Y, измеряемые относительно координат левого верхнего угла текущего графического окна.
moveto(int x, int y);
Устанавливает новое значение координат текущей позиции. Аргументы х, у задают новые значения координат текущей позиции относительно координат левого верхнего угла текущего графического окна.
moverel(int dx, int dy);
Устанавливает новое значение координат текущей позиции. Аргументы dx, dy задают новые значения координат относительно текущих координат графического окна
gettextsettings(struct textsettingstype *texttypeinfo);
Заполняет поля структурной переменной по шаблону textsettingstype информацией о текущих шрифте, направлении вывода текста, размере знакоместа относительно шрифта по умолчанию и способе "прижатия" (выравнивания) шрифта в пределах знакоместа.
settextstyle(int font, int direction, int charsize);
Выбирает шрифт, устанавливает направление и размер знакоместа для последующего вывода текстовой информации.
textheight(char* textstring);
Возвращает высоту строки символов в пикселах, на которую указывает textstring.
int textwidth(char* textstring);
Возвращает ширину строки символов в пикселах, на которую указывает textstring.
settextjustify(int horiz, int vert);
Задаёт новую установку выравнивания символов текста в графических режимах работы адаптера.
outtext(char* textstring);
Выводит ASCII-строку текста, на начало которой указывает textstring, используя текущие позицию, цвет и установки направления, типа шрифта и выравнивания строки.
outtextxy(int x, int y, char* textstring);
Выводит ASCII-строку текста, на начало которой указывает textstring, используя текущие цвет, установки направления, типа шрифта и выравнивания строки.
getlinesettings(struct linesettingstype* lineinfo);
Возвращает информацию об установленном в текущий момент времени стиле «рисования» отрезков прямых линий и графических примитивов.
setlinestyle(int linestyle, unsigned upattern, int thickness);
Устанавливает стиль «рисования» отрезков прямых линий и графических примитивов.
setwritemode(int mode);
Устанавливает режим вывода отрезков прямых линий в значение, определяемое аргументом mode.
getaspectratio(int* xasp, int* yasp);
Заполняет две переменные, описанные точкой вызова, значениями коэффициента сжатия для текущего видеорежима.
setaspectratio(int xasp, int yasp);
Устанавливает новое значение коэффициента сжатия, которое будет использоваться системой графики при выводе геометрических примитивов.
getfillpattern (char * pattern);
Заполняет область памяти из 8 байт, описанную точкой вызова, текущим значением маски заполнения.
setfillpattern (char* upattern, int color);
Задаёт цвет пикселов и маску для заполнения областей экрана.
getfillsettings(struct fillsettingstype* fillinfo);
Заполняет поля структурной переменной по шаблону struct fillsettingstype информацией о текущей маске и цвете заполнения.
setfillstyle(int pattern, int color);
Выбирает один из предопределённых стилей заполнения.
unsigned getpixel( int x, int у);
Определяет, лежит ли пиксел с координатами (х, у) в текущем графическом окне, и, если лежит, возвращает код цвета этого пиксела. В противном случае возвращается 0.
putpixel(int x, int у, int pixelcolor);
Определяет, лежит ли пиксел с координатами (х, у) в текущем графическом окне, и, если лежит, выводит на экран пиксел, код цвета которого равен pixelcolor. В противном случае цвет пиксела не изменяется.
line(int x1, int y1, int x2, int y2);
Выводит отрезок прямой линии между двумя явно специфицированными точками (x1, y1) и (х2, у2), используя текущие цвет, стиль, толщину и режим вывода линии.
linerel(int dx, int dy);
Выводит отрезок прямой линии между текущей позицией (начало отрезка) и точкой, заданной горизонтальным смещением dx и вертикальным смещением dy от текущей позиции (конец отрезка).
lineto(int x, int y);
Выводит отрезок прямой линии между текущей позицией (начало отрезка) и точкой, заданной горизонтальной координатой х и вертикальной координатой у (конец отрезка).
arc(int x, int y, int stangle, int endangle, int radius);
Выводит дугу окружности радиусом radius. Центр окружности задают координаты х, у.
bar(int left, int top, int right, int bottom);
Выводит полосу, заполненную текущим цветом с использованием текущей маски заполнения.
bar3d(int left, int top, int right, int bottom, int depth, int topflag);
Выводит в изометрии «столбик» и заполняет его фронтальную поверхность текущим цветом с использованием текущей маски заполнения.
circle(int x, int y, int radius);
Выводит окружность заданного аргументом radius радиуса с центром, за-данным координатами х и у.
drawpoly(int numpoints, int polypoints[]);
«Соединяет» отрезками прямых линий текущего цвета и стиля точки (полигон), координаты которых заданы парами значений.
ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);
Выводит эллиптическую дугу или полный эллипс, используя текущий цвет.
fillellipse(int x, int y, int xradius, int yradius);
Выводит эллипс, заполненный текущим стилем.
fillpoly(int numpoints, int *polypoints);
Выводит контур полигона, заданного numpoints точками.
floodfill(int x, int y, int border);
Заполняет текущим стилем область экрана, ограниченную непрерывной линией с цветом border, начиная с точки с координатами (х, у).
pieslice(int x, int y, int stangle, int endangle, int radius);
Выводит контур кругового сектора и заполняет его внутреннюю область текущим стилем.
rectangle(int left, int top, int right, int bottom);
Выводит контур прямоугольника, заданного координатами левого верхнего и правого нижнего углов.
sector(int x, int y, int stangle, int endangle, int xradius, int yradius);
Работает аналогично функции pieslice(), за исключением того, что выводится не круговая, а эллиптическая дуга.
Текст программы.
#include <GRAPHICS.H>
#include <MATH.H>
#include <CONIO.H>
// ФИО 9300, вариант 7
// sin²(x) - cos²(x) [3p/2; 7p]
int main() {
int grDriver = DETECT;
int grMode;
int grErrorCode;
struct viewporttype viewport;
int centerY;
int lengthX, lengthY;
int pixelsPerOneY;
double pixelsPerPiX;
int i;
double j, x, f, preY, max;
char maxStr[20] = "";
clrscr();
initgraph(&grDriver, &grMode, "C:\\TURBOC3\\BGI");
grErrorCode = graphresult();
if (grErrorCode != grOk) {
cprintf("Initialization driver error: %s", grapherrormsg(grErrorCode));
getch();
return 255;
}
settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 1);
// Окно графика
setviewport(16, 16, getmaxx() - 16, getmaxy() - 71, 0);
getviewsettings(&viewport);
lengthX = viewport.right - viewport.left;
lengthY = viewport.bottom - viewport.top;
setcolor(DARKGRAY);
rectangle(-1, -1, lengthX + 1, lengthY + 1);
// Рисование осей
centerY = lengthY / 2;
setcolor(WHITE);
setusercharsize(2, 3, 2, 3);
settextjustify(RIGHT_TEXT, BOTTOM_TEXT);
outtextxy(lengthX, centerY - 10, "X");
settextjustify(LEFT_TEXT, TOP_TEXT);
outtextxy(40, 0, "Y");
setusercharsize(5, 9, 5, 9);
settextjustify(RIGHT_TEXT, TOP_TEXT);
outtextxy(25, centerY + 5, "0");
// - ось X
lengthX = viewport.right - viewport.left;
pixelsPerPiX = ((double) (lengthX - 50)) / 7.0;
line(0, centerY, lengthX, centerY);
settextjustify(CENTER_TEXT, TOP_TEXT);
for (i = 1; i <= 7; i++) {
int x = 30 + (int) (pixelsPerPiX * i);
char* label = "...";
if (i == 1) label = "pi";
else sprintf(label, "%dpi", i);
outtextxy(x, centerY + 5, label);
line(x, centerY - 5, x, centerY + 5);
}
// - ось Y
lengthY = viewport.bottom - viewport.top;
pixelsPerOneY = 20 - centerY;
line(30, 0, 30, lengthY);
settextjustify(RIGHT_TEXT, CENTER_TEXT);
line(25, 20, 35, 20);
outtextxy(25, 20, "1");
line(25, lengthY - 20, 35, lengthY - 20);
outtextxy(25, lengthY - 20, "-1");
// Рисование графика
setcolor(YELLOW);
x = 3 * M_PI / 2;
max = (pow(sin(x), 2) - pow(cos(x), 2));
preY = centerY + max * pixelsPerOneY;
for (j = 3 * pixelsPerPiX / 2 + 1; j < pixelsPerPiX * 7; j += 1) {
x = j / pixelsPerPiX * M_PI;
f = (pow(sin(x), 2) - pow(cos(x), 2));
if (max < f) max = f;
f *= pixelsPerOneY;
line(j - 1 + 30, preY, j + 30, centerY + f);
preY = centerY + f;
}
// Окно с максимумом
setviewport(16, getmaxy() - 56, getmaxx() - 16, getmaxy() - 16, 0);
getviewsettings(&viewport);
lengthX = viewport.right - viewport.left;
lengthY = viewport.bottom - viewport.top;
setcolor(DARKGRAY);
rectangle(-1, -1, lengthX + 1, lengthY + 1);
setcolor(LIGHTGRAY);
getviewsettings(&viewport);
sprintf(maxStr, "Max value is %f", max);
settextjustify(CENTER_TEXT, CENTER_TEXT);
setusercharsize(3, 4, 3, 4);
outtextxy((viewport.right - viewport.left) / 2, (viewport.bottom - viewport.top) / 2, maxStr);
getch();
closegraph();
return 0;
}
Блок-схема.
Рисунок 1. Блок-схема программы.
Структурная схема аппаратных средств.
Рисунок 2. Структурная схема аппаратных средств.
Вывод.
Была изучена работа с видеосистемой в графическом режиме, освоено использование графической библиотеки <graphics.h>, написана программа, использующая эту библиотеку.