Инициализация графического режима

Простейшим способом подключения драйвера к программе является его автоматическая загрузка с помощью функции initgraph. Полный синтаксис этой функции: void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver). Аргументами этой функции являются указатели на переменные, содержащие номер графического драйвера, номер графического режима этого драйвера и путь к BGI-файлу драйвера.

Пример:

int gdriver = DETECT, gmode, errorcode;

/*инициализация графического режима */

initgraph(&gdriver, &gmode, "");

/* результат инициализации */

errorcode = graphresult();

if (errorcode != grOk) /* при ошибке */{

printf("Graphics error: %s\n",

grapherrormsg(errorcode));

printf("Press any key to halt:");

getch(); exit(1); /* выход с кодом ошибки */ }

Функции работы с растром точек.

Функция отображения на экране любой из имеющихся страниц видеопамяти: void far setvisualpage(int page);

Функция, направляющая весь последующий графический вывод на ту страницу, которая указана ее аргументом: void setactivepage(int page);

Экран дисплея можно представить как двумерный прямоугольный массив точек. На этом массиве вводится система координат X,Y. Начало этой системы лежит в верхнем левом углу экрана. Ось X проходит по верхнему краю экрана слева направо, ось Y – по левому краю сверху вниз. Левая верхняя точка страницы имеет координаты (0,0), правая нижняя – координаты (M-1, N-1), где M и N – размеры страницы по горизонтали и по вертикали. Такие системы координат вводятся независимо для каждой из имеющихся видеостраниц.

Определить максимальное количество точек, допустимых в данном графическом режиме, можно с помощью функций:

int far getmaxx(void);

int far getmaxy(void);

При установке нового графического окна текущая графическая позиция автоматически помещается в его начало координат. Для изменения текущей позиции используются функции void far moveto(int x, int y); void far moverel(int dx, int dy);

Первая помещает текущую позицию по указанным координатам, вторая – перемещает текущую позицию на вектор, указанный аргументами.

Координаты текущей позиции возвращаются функциями: int far getx(); int far gety();

Для очистки графического окна используется функция void far cleardevice();

Функции управления цветом

Максимальное значение атрибута пиксела, которое разрешается использовать для записи в видеопамять возвращает функция int far getmaxcolor();

Цветом фона можно управлять с помощью функции void far setbkcolor(int color); Обратная функция void far getbkcolor(int color);

Функция, изменяющая значение рисующего цвета int far setcolor(int color); Узнать текущее значение рисующего цвета можно с помощью функции int far getcolor();

Некоторые базовые функции доступа к видеопамяти

Доступ к отдельным пикселам активной страницы осуществляют функции: unsigned far getpixel(int x, int y); void far putpixel(int x, int y, int color);

Графические примитивы

Контурные графические примитивы.

void far line(int x1, int y1, int x2, int y2);

void far linerel(int dx, int dy);

void far lineto(int x, int y);

void far rectangle(int left, int top, int right, int bottom);

void far drawpoly(int numpoints, int far *polypoints);

void far circle(int x, int y, int radius);

void far arc(int x, int y, int stangle, int endangle, int radius);

void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);

Функция void far setlinestyle(int linestyle, unsigned upattern, int thickness); устанавливает характер и толщину линий геометрических объектов. При этом aргумент thickness воздействует на все контурные графические примитивы, а аргумент linestyle и upattern – только на кусочно-линейные.

Аргумент thickness принимает одно из нижеприведенных значений:

NORM_WIDTH = 1 //толщина линии равна одному пикселу;

THICK_WIDTH = 3 //толщина линии равна трем пикселам.

Аргумент linestyle задает характер рисуемой линии и действует только на кусочно-линейные графические примитивы. Возможные значения аргумента:


SOLID_LINE = 0,

DOTTER_LINE = 1,

CENTER_LINE = 2,

DASHED_LINE = 3,

USERBIT_LINE = 4.


Если при вызове функции setlinestyle какие-либо аргументы имеют недопустимые значения, то функция игнорируется, предыдущие установки сохраняются, а функция graphrezult возвращает значение –11.

Площадные графические примитивы.

void far bar(int left, int top, int right, int bottom);

void far bar3d(int left, int top, int right, int bottom, int depth, int topflag);

void far fillpoly(int numpoints, int far *polypoints);

void far fillellipse(int x, int y, int xradius, int yradius);

void far pieslice(int x, int y, int stangle, int endangle, int radius);

void far sector(int x, int y, int stangle, int endangle, int xradius, int yradius);

void far floodfill(int x, int y, int border);

Перечисленные функции строят некоторые геометрические фигуры и заполняют их внутренние области установленными кодами. Функция floodfill сама не выполняет никаких построений, а только закрашивает область, ограниченную контуром, уже нарисованным на странице видеопамяти.

Функция setcolor задает цвет рисования контура, для выбора кода заполнения используется функция void far setfillstyle(int pattern, int color);

Первый аргумент указывает тип устанавливаемого шаблона, второй – цвет. Существует 12 заранее определенных типов шаблонов:


EMPTY_FILL,

SOLID_FILL ,

LINE_FILL ,

LTSLASH_FILL ,

SLASH_FILL ,

BKSLASH_FILL ,

LTBKSLASH_FILL ,

HATCH_FILL ,

XHATCH_FILL ,

INTERLEAVE_FILL ,

WIDE_DOT_FILL ,

CLOSE_DOT_FILL .


Задание на выполнение:

1. Построить на экране монитора графики функции y=k*sinx+c, для 2-3 значений k и с разными цветами.

2. Построить на экране монитора круговую диаграмму для n значений некоторой переменной. Значения n и переменной задавать с клавиатуры.

3. Построить на экране монитора столбчатую объемную диаграмму для n значений некоторой переменной. Значения n и переменной задавать с клавиатуры.

4. Заполнить поле экрана монитора кругами, окружностями, закрашенными и незакрашенными треугольниками и квадратами случайным образом. Тип фигуры и ее цвет получать с помощью функции random();

5. Изобразить движение секундной стрелки. После прохождения полного круга стрелка должна менять цвет. Цикл продолжать до нажатия некоторой клавиши.

6. Заполнить поле экрана монитора изображением пчелиных сот (шестигранниками).

7. Построить на экране монитора n-лучевую звезду. Количество лучей n, длину каждого луча и его цвет получить воспользовавшись функцией random()


Литература

1. Р. Уинер. «Язык Турбо Си», Москва, Мир, 1991г.

2. В.В. Подбельский, С.С. Фомин. «Программирование на языке Си». М: Финансы и статистика, 1998.

3. Громов Ю.Ю.,Татаренко С.И. «Программирование на языке СИ»: Учебное пособие. -Тамбов,1995