Лабораторная работа: Программирование в СИ

Многие функции, использующие координаты точек, подразумевают именно систему координат графического окна. Благодаря этому появляется возможность использовать одну и ту же программу для выполнения некоторой графической работы в окне независимо от того, в каком месте страницы и даже на какой именно странице окно находится в данный момент. В дальнейшем при описании таких функций всегда будет указываться, какая система координат (страницы или окна) имеется в виду.

При установке графического режима при помощи функций initgraph и setgraphmode сразу же создается и графическое окно, совпадающее по размерам со всей страницей. Однако есть возможность управлять размерами и расположением графического окна динамически. Делаетсяэтоспомощьюфункции

void far setviewport(int left.int top,int right,int bottom,int clip);

Первые четыре аргумента – это координаты левой верхней и правой нижней границ графического окна в системе координат страницы. Ни одна из границ окна не может лежать за пределами страницы. Последний аргумент устанавливает режим отсечения: если он не нулевой, то всякий графический вывод будет обрезаться на границах графического окна. Если при вызове фунции setviewport были неверно заданы аргументы, то функция graphresult возвратит -11 и сохранится предыдущая установка графического окна. Функция setviewport не меняет содержимое страницы видеопамяти.

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

void far getviewsettings(struct viewporttype far *viewport);

Данная функция помещает параметры текущего окна в структуру *viewport. Тип этой структуры определен в файле graphics.h:

struct viewporttype{int left,top,right,bottom;int clip;}

Возвращаемые координаты представлены в системе координат стра­ницы.

С графическим окном связано понятие текущей графической позиции CP(current graphics position). Это графический эквивалент курсора в текстовом режиме. Текущая графическая позиция сама собой никак не отображается на экране и идентифицирует выбранный пиксель графического окна, к которому привязывается действие некоторых функций, таких как вычерчивание прямолинейных отрезков или вывод графических текстов.

При установке нового графического окна текущая позиция автоматически помещается в его начало координат. Для явного изменения положения текущей позиции используются функции

void far moveto(int x, int y);void far moverel(int dx, int dy);

Первая помещает CPпо указанным координатам графического окна. Вторая перемещает CP на вектор (dx, dy).

Координаты текущей графической позиции в системе координат графического окна возвращают функции:

int far getx(void);int far gety(void);

При переустановке графического окна функцией setviewport содержимое страницы видеопамяти не изменяется. Для очистки графического окна на активной в данный момент странице используется функция

void far clearviewport(void);

CP при этом перемещается в начало координат графического окна.

Похожаяфункция

void far cleardevice(void);

очищает всю активную страницу. Установка графического окна при этом не изменяется, а CPперемещается в его начало координат.

На многих мониторах пиксель, который высвечивается на экране, имеет форму прямоугольника, вытянутого по вертикали. Это объясняется тем, что на дисплее страница видеобуфера отображается на весь экран, а пропорции экрана и страницы в режиме максимального разрешения, как правило, не совпадают (исключение – мониторы с адаптерами VGA, где в режиме с разрешением 640 х 480 точек все пиксели квадратные). Такое несоответствие приводит к возникновению анизотропности растра пикселей: горизонтальный и вертикальный отрезки, содержащие одинаковое число пикселей, на экране будут выглядеть, как отрезки разной длины.

Тем не менее, окружности и их дуги рисуются функциями библиотеки правильно, так как эти функции используют хранящийся в графической системе корректирующий коэффициент пропорциональности (aspect ratio), учитывающий “степень неквадратности” пикселя. Чтобы правильно нарисовать квадрат, необходимо произвести корректировку количества пикселей по его горизонтальной и вертикальной сторонам. Истинные пропорции пикселя на данном дисплее можно узнать с помощью функции

void far getaspectratio(int far *x_asp,int far *y_asp);

Данная функция через свои аргументы возвращает искомое значение, причем *y_asp всегда устанавливается равным 10 000, а величина *x_asp ≤ *y_asp. Отношение *x_asp к *y_asp как раз и есть отношение горизонтального и вертикального размеров пикселя. Теперь, если горизонтальная сторона квадрата представлена отрезком длиной X пикселей, то длина вертикальной стороны должна быть равна значению выражения

Y = (int)(X ∙ (float)(*x_asp) / (*y_asp)).

Заметим, что коэффициент “неквадратности” автоматически учитывается только функциями, которые рисуют окружности и их дуги, но никак не влияет на функции рисования эллипсов и их дуг.

1.4. Управление цветом

Цветовые возможности функций графической библиотеки Borland C описываются в терминах цветовой палитры режима – закона, по которому каждому допустимому значению атрибута пикселя ставится в соответствие цвет, которым этот пиксель будет отображаться на экране.

Палитру режима можно представить как таблицу, содержащую столько строк (входов), сколько значений допускается для атрибута пикселя в данном графическом режиме. Строки палитры режима нумеруются от нуля до N_palette-1. В строке с номером k содержится код цвета, которым аппаратура видеоадаптера отображает на экране все пиксели страницы, атрибуты которых равны k. Нулевой вход палитры режима, кроме того, определяет цвет фона экрана.

Все графические режимы можно разделить на три группы:

· монохромные режимы, в которых все пиксели могут быть двух цветов – основного и фонового. Палитру таких режимов изменить невозможно;

· цветные режимы с фиксированной палитрой. Для изменения палитры режима нужно менять графический режим, что приводит к потере содержимого видеопамяти;

· графические режимы, позволяющие динамически (без потери содержимого видеопамяти) изменять код цвета по любому входу палитры режима. К данным режимам относятся режимы драйверов EGA, VGA, IBM8514.

Механизм управления цветом в Borland C включает в себя важный элемент – структуру данных, называемую внутренней палитрой. При работе в графических режимах на всех дисплейных адаптерах, кроме VGA и IBM8514, она содержит коды цветов из таблицы цветов адаптера. Роль внутренней палитры при работе с адаптером VGA несколько иная и будет рассмотрена ниже. Драйвер IMB8514 вообще не пользуется внутренней палитрой, поэтому в дальнейшем все, что будет говориться о работе с внутренней палитрой, не относится к этому драйверу. Не следует путать внутреннюю палитру (обычную переменную структурного типа) графической системы с палитрой режима с законом преобразования значения пикселя в цвет.

Определение внутренней палитры как структуры данных имеет вид:

#define MAXCOLOR 15struct palettetype{unsigned char size;signed char colors[MAX_COLORS+1];};

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

Для всех монохромных режимов и режимов с фиксированными палитрами допускается использование во внутренней палитре 16 цветов, которые в точности совпадают со стандартными цветами текстового режима. Каждый цвет палитры кодируется числом от 0 до 15. При инициализации таких графических режимов значение каждого элемента массива colors совпадает с его индексом.

К-во Просмотров: 287
Бесплатно скачать Лабораторная работа: Программирование в СИ