Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologia_programmirovania.pdf
Скачиваний:
182
Добавлен:
08.04.2015
Размер:
1.76 Mб
Скачать

148

11

 

}

 

 

int main()

 

{

 

 

int h;

 

// Ширина полосы флага

int x = 2, y = 2;

// Координаты левого верхнего угла

cout << "Введите размер флага от 1 до 5";

cin >> h;

 

RussFlag(x, y, h);

 

getch();

// Ждем нажатия клавиши

NormScreen();

// Восстанавливаем исходные настройки экрана

return 0;

 

}

 

 

12.2.Графический режим

Вграфическом режиме все изображения на экране создаются светящимися точками – пикселями. Разрешающая способность, то есть

количество пикселей по горизонтали и по вертикали, зависит от типа монитора и типа электронной схемы (видеоадаптера), обеспечивающей работу монитора.

В состав TC входит библиотека функций для реализации точечной графики, прототипы которых находятся в файле graphics.h.

Графические драйверы и режимы

Для поддержки графического режима работы экрана в оперативную память должна быть загружена специальная программа – графический драйвер. В TC имеются шесть файлов с графическими драйверами:

CGA.BGI, EGAVGA.BGI, IBM8514.BGI, HERC.BGI, ATT.BGI, PC3270.BGI. Заметим, что расширение BGI произошло от слов Borland Graphic Interface. Каждый файл содержит драйвер для одного или нескольких близких по типу видеоадаптеров. Логически TC различает десять графических драйверов. Для каждого драйвера в файле graphics.h определена константа, которую можно считать символическим именем драйвера. Константы графических драйверов, их значения и соответствующие имена файлов перечислены в табл.39.

Таблица 40. Графические драйверы Turbo C++

Константа (символическое

Значение

Имя файла драйвера

имя драйвера)

константы

 

CGA

1

CGA.BGI

MCGA

2

CGA.BGI

EGA

3

EGAVGA.BGI

EGA64

4

EGAVGA.BGI

О файлах и командной строке 149

EGAMONO

5

EGAVGA.BGI

IBM8514

6

IBM8514.BGI

HERCMONO

7

HERC.BGI

ATT400

8

ATT.BGI

VGA

9

EGAVGA.BGI

PC3270

10

PC3270.BGI

DETECT

0

 

Константа DETECT используется, когда системе самой поручается определить тип видеоадаптера и загрузить соответствующий драйвер. При этом будет использован драйвер, обеспечивающий максимальное разрешение.

Графические драйверы обеспечивают один или несколько различных графических режимов, для которых в файле graphics.h определены константы. В табл.41 приведены имена и значения этих констант для драйвера VGA, разрешение и количество цветов.

Таблица 42. Константы графических режимов

Графический

Константа

Значение

Разрешени

Количеств

драйвер

графического

константы

е,

о цветов

 

режима

 

пикселей

 

VGA

VGALO

0

640 x 200

16

 

VGAMED

1

640 x 350

16

 

VGAHI

2

640 x 480

16

Инициализация графики

Для перевода адаптера экрана в графический режим и загрузки соответствующего драйвера служит библиотечная функция initgraph. Ее прототип имеет вид:

void initgraph(int* GraphDriver, int* GraphMode, char* PathToDriver);

Графический драйвер ищется в каталоге, имя которого указано в аргументе PathToDriver. Если в указанном каталоге драйвер не найден, то просматривается текущий каталог. Если в качестве третьего аргумента указана пустая строка "", то просматривается только текущий каталог. Параметр GraphDriver указывает номер драйвера, GraphMode указывает номер графического режима, который должен быть установлен.

Если положить GraphDriver = 0 или библиотечной константе DETECT, то производится автоматическое распознавание графического адаптера, в память загружается соответствующий драйвер, устанавливается режим с максимальным разрешением, а переменным, указанным в аргументах GraphDriver и GraphMode, присваиваются значения, равные номеру драйвера и номера режима.

150 11

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

int graphresult(void);

после каждой графической операции. Результат, равный 0 (значение библиотечной константы grOk), означает удачное, а отрицательное значение – неудачное выполнение операции.

Для восстановления текстового режима служит функция: void closegraph();

Эта функция освобождает память, выделенную графическому драйверу

ивыбранному виду шрифта, использовавшегося в графическом режиме.

Вграфическом режиме каждый пиксель имеет две координаты – по горизонтали и по вертикали экрана. Начало координат находится в левом верхнем углу экрана. Нумерация пикселей начинается с нуля.

Направление

отсчета:

по

горизонтали – слева

направо,

по

вертикали – сверху вниз.

 

 

 

 

Функции рисования

Для рисования на экране имеется довольно много библиотечных функций, объявленных в заголовочном файле graphics.h. Рассмотрим некоторые.

Функция

int getcolor(void);

возвращает текущий цвет рисования. Всего для рисования доступно 16 цветов, они кодируются такими же константами, как в текстовом режиме, табл.43.

Функция

void setcolor(int color);

устанавливает новый цвет рисования color. Функция

int getbkcolor(void);

возвращает текущий цвет фона. Функция

void setbkcolor(int color);

устанавливает новый цвет фона color. Функция

void putpixel(int x, int y, int color);

О файлах и командной строке 151

изображает на экране точку с координатами x, y цветом color. Функция

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

рисует на экране отрезок прямой, соединяющий точки с координатами (x1, y1) и (x2, y2), используя текущий цвет, текущие стиль и толщину линий. По умолчанию текущим является белый цвет, текущим стилем – сплошная линия, а текущей толщиной – толщина в один пиксель.

Функция

void circle (int x, int y, int Radius);

изображает на экране окружность радиуса Radius с центром, имеющим координаты x, y.

Функции:

int getmaxx(void); int getmaxy(void);

возвращают максимальные координаты точек на экране соответственно в горизонтальном и вертикальном направлениях.

Программа 34. Звезда

На экране рисуется звезда с заданным числом лучей N, вписанная в окружность. Для построения звезды понадобятся некоторые математические вычисления. На рис.52 показана схема экрана, действующая на нем физическая система координат и геометрические построения, необходимые для изображения семиугольной звезды. Показан случай, когда используется драйвер VGA и действует режим работы экрана VGAHI с разрешение 640*480. Максимальная координата пикселя по горизонтальной оси в этом случае будет 639, а по вертикальной 479.

152 11

0

xс

x1

639

x

0

 

0

 

 

 

 

 

 

6

 

1

 

 

y1

 

 

 

 

 

R

 

 

yc

 

f1

 

 

 

 

 

 

5

 

 

2

 

4

 

3

 

 

479

y

Рис.53. Чертеж для построения звезды

Через xc, yc обозначены координаты центра звезды, R – радиус звезды. Будем нумеровать лучи, начиная с 0. Пусть нулевой луч направлен вверх. Положение лучей можно определять углом fi, отсчитываемым от вертикали. Для i-го луча этот угол будет

fi = i × 2p / N .

Из чертежа видно, что координаты первой вершины можно найти по формулам:

x1 = xc + R sin f1 , y1 = yc - R cos f1 .

Координаты i-й вершины рассчитываются по аналогичным формулам, только вместо 1 нужно подставить i.

Когда рассчитаны координаты вершин, построение сводится к соединению их отрезками прямых. Если соединять соседние вершины, получится просто правильный многоугольник. Для семи вершин можно построить два вида звезды, пропуская либо два, либо три отрезка разбиения. Такая возможность в программе реализована с помощью переменной m, задающей число пропускаемых отрезков разбиения.

//Файл Star.cpp

//Программа изображает на экране правильную звезду,

//вписанную в окружность.

#include <graphics.h> #include <conio.h> #include <stdlib.h>

 

О файлах и командной строке

153

#include <math.h>

 

 

 

#include <iostream.h>

 

 

 

int main()

 

 

 

{

 

 

 

int Driver, Mode;

 

 

 

int xc, yc;

 

// Координаты центра звезды

 

const int N = 7;

 

// Количество лучей звезды

 

int m = 3;

// Количество пропускаемых отрезков

const int ColorCircle = YELLOW;

// Цвет окружности

 

const int ColorStar = LIGHTRED;

// Цвет звезды

 

int R = 100;

 

// Радиус окружности

 

double df = 2 * M_PI / N;

 

// Угол между лучами

 

double f;

 

 

 

int x[N], y[N];

 

// Координаты концов лучей

 

int i;

 

 

 

Driver = DETECT;

// Автоматическое определение драйвера

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

 

initgraph(& Driver, & Mode, "C:\\TC30\\BGI");

 

if (graphresult() != grOk){

 

// Если ошибка,

 

cerr << "Не удалось инициализировать графику \n";

 

exit(1);

 

// завершить программу

 

}

 

 

 

xc = getmaxx() / 2;

 

// Координаты

 

yc = getmaxy() / 2;

 

// центра экрана

 

for(i = 0; i < N; i++){

// Вычисление координат концов лучей

f = df * i;

 

// Угол i-го луча

 

x[i] = xc + R * sin(f);

 

// Координаты

 

y[i] = yc - R * cos(f);

 

// вершины

 

}

 

 

 

setcolor(ColorCircle);

 

// Установка цвета для окружности

circle(xc, yc, R);

 

// Рисование окружности

 

setcolor(ColorStar);

 

// Установка цвета для звезды

 

for(i = 0; i < N; i++)

 

// Рисование лучей

 

line(x[i], y[i], x[(i + m) % N], y[(i + m) % N]); getch();

closegraph(); return 0;

}

Обратите внимание на строку "C:\\TC30\\BGI", задающую путь к папке, в которой находятся файлы графических драйверов. В DOS и Windows принято имена вложенных папок отделять обратной наклонной чертой. Для изображения обратной наклонной черты в программе на языке C++, она удваивается.

Координаты вершин звезды хранятся в массивах x и y из N элементов. Для изображения звезды, например, при N=7 и m=3 нужно