Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3. Исследование видеосистемы (графический режим)

.docx
Скачиваний:
5
Добавлен:
19.06.2023
Размер:
132.08 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

отчЁт

по лабораторной работе №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>, написана программа, использующая эту библиотеку.

Соседние файлы в предмете Организация ЭВМ и вычислительных систем