48247 (566500), страница 3

Файл №566500 48247 (Программирование в СИ) 3 страница48247 (566500) страница 32016-07-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)

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

#define MAXCOLOR 15

struct palettetype

{

unsigned char size;

signed char colors[MAX_COLORS+1];

};

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

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

В режимах с динамическим управлением внутренняя палитра содержит 16 цветов, коды которых могут лежать в диапазоне от 0 до 63
(т. е. имеется возможность менять содержание внутренней палитры). Для 16 кодов цветов стандартного набора, устанавливаемых при инициализации этих режимов (как для драйвера EGA, так и VGA), определен перечислимый тип EGA_COLORS, т. е. стандартные коды цветов имеют символические имена:

enum EGA_COLORS

{

EGA_BLACK=0, EGA_BLUE=1, EGA_GREEN=2, EGA_CYAN=3, EGA_RED=4, EGA_MAGENTA=5, EGA_BROWN=20, EGA_LIGHTGRAY=7, EGA_DARKGRAY=56, EGA_LIGHTBLUE=57, EGA_LIGHTGREEN=58, ЕGA_LIGHTCYAN=59, EGA_LIGHTRED=60, EGA_LIGHTMAGENTA=61, EGA_YELLOW=62, EGA_WHITE=63

};

Количество динамически управляемых строк таблицы цветов для текущего графического режима можно определить при помощи функции:

int far getpalettesize(void);

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

int far getmaxcolor(void);

Непосредственное изменение внутренней палитры осуществляется с помощью функций setpalette или setallpalette. Первая изменяет содержание только одного входа палитры, а вторая всех сразу. Синтаксис первой функции:

void far setpalette(int num_color_pallete,int num_color);

Аргумент num_color_palette задает номер изменяемого входа внутренней палитры и должен лежать в пределах от нуля до size-1 (size – элемент структуры данных palettetype). Аргумент color задает новое значение кода цвета для этого входа в диапазоне от 0 до 63 (реально используются только шесть младших бит аргумента num_color).

Другая функция, изменяющая внутреннюю палитру, имеет синтаксис:

void far setallpalette(struct palettetype far *palette);

Аргумент ее является указателем на структуру, содержащую ва­риант желаемой палитры. Все изменения в текущей внутренней палитре, произведенные функциями setpalette и setallpalette немедленно отображаются на экране дисплея.

Цветом фона можно управлять с помощью функции

void far setbkcolor(int num_color_palette);

Действие функции заключается в том, что нулевой вход внутренней палитры связывается со входом, имеющим номер num_color_palette. Это означает, что в нулевой элемент внутренней палитры записывается значение, которое в данный момент содержится в элементе с номером num_color_palette. Кроме того, все последующие изменения содержимого элемента с номером num_color_palette будут немедленно дублироваться в нулевой элемент. Заметим, что функция setpalette(0, color) просто изменяет цвет фона, но не связывает нулевой вход ни с каким другим.

Обратной для функции установки цвета фона является функция

int far getbkcolor(void);

которая возвращает текущее назначение для фонового цвета, т.е. номер того входа внутренней палитры, с которым связан в настоящий момент нулевой вход. Если ранее при помощи функции setbkcolor не произошло связывания ни с каким входом, то getbkcolor возвращает 0.

Для получения информации о текущей внутренней палитре существует две функции:

void far getpalette(struct palettetype far *palette);

struct palettetype far *getdefaultpalette(void);

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

Все вышеописанные способы динамического управления цветом рассчитаны на адаптеры, в которых пиксель может быть представлен не более чем четырьмя битами. Однако некоторые адаптеры допускают восьмибитовую величину атрибута пикселя (IBM8414 и VGA, имеющие в таблице цветов 256 входов). Для них существует расширенная палитра, которая содержит 256 входов. Каждый вход соответствует коду цвета. Для того чтобы какому-либо коду соответствовал другой оттенок цвета, используется функция

void far setrgbpalette(int num_color,int red,int green,int blue);

Аргумент num_color – номер входа расширенной палитры (0–255), по которому хранятся три цветовые компоненты – красная, зеленая и синяя – составляющие желаемый цвет. Функция позволяет записать по входу расширенной палитры с номером color цветовые компоненты red, green и blue. При этом реально используются только младшие шесть байт каждой компоненты. Таким образом, общее количество цветовых оттенков равно N_colors=64*64*64=256К.

Отметим некоторые особенности использования драйвера VGA. Значения элементов массива colors (кодов цветов) обычной внутренней палитры служат индексами для поиска нужного цвета в расширенной таблице, откуда происходит выбор нужного оттенка цвета.

Заметим, что функция setrgbpalette правильно работает только с дисплейными адаптерами VGA и IBM8514. На других конфигурациях ПК она игнорируется. Кстати, изменить палитру при работе с адаптером IBM8514 можно только при помощи функции setrgbpalette.

Рассмотрим теперь понятие текущего значения рисующего цвета (current drawing color). Рисующий цвет – это то значение, которое используется функциями рисования для записи в атрибуты пикселей. Значение рисующего цвета неотрицательно и не должно превышать значения, возвращаемого функцией getmaxcolor.

Существует функция, позволяющая явно изменять текущее значение рисующего цвета:

void far setcolor(int num_color_palette);

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

int far getcolor(void);

    1. Базовые функции доступа к видеопамяти

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

Доступ к отдельным пикселям активной страницы осуществляют две функции:

unsigned far getpixel(int x,int y);

void far putpixel(int x,int y,int num_color_palette);

Функция getpixel возвращает атрибут (вход во внутреннюю палитру) пикселя с координатами (x, y). А функция putpixel рисует пиксель в точке с координатами (x, y) цветом, чей код содержится по входу во внутреннюю палитру с номером num_color_palette.

Несмотря на то, что функциям getpixel и pupixel координаты пикселя задаются в системе координат графического окна, ничто не мешает указать координаты любого пикселя страницы, лежащего вне окна. При этом getpixel возвращает правильное значение атрибута указанного пикселя. Поведение функции putpixel зависит от режима отсечения, установленного с помощью последнего аргумента при вызове функции setviewport. Результаты работы функций getpixel и pupixel с выходящими за пределы страницы координатами точек непредсказуемы.

Кроме обмена с видеопамятью отдельными пикселями графическая библиотека предоставляет возможности для обмена целыми массивами пикселей. Это бывает полезно, например, когда нужно временно сохранить какой-то фрагмент страницы, чтобы в дальнейшем восстановить его на прежнем или новом месте. Обмен производится прямоугольными массивами, которые задаются координатами своих углов в системе координат текущего графического окна.

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

unsigned far imagesize(int left,int top,int right,int bottom);

Она получает в качестве аргументов координаты левого верхнего и правого нижнего угла сохраняемой области. Возвращаемое значение можно передавать одной из функций выделения памяти для резервирования необходимого пространства. Если объем памяти, требуемый для сохранения изображения, превосходит 64К-1, то функция все равно возвращает значение 0xFFFF, но при этом graphresult выдает значение -11.

После резервирования требуемого объема оперативной памяти, он может сохранить массив пикселей с помощью функции

void far getimage(int left,int top,int right,int bottom,void far *bitmap);

Последний аргумент – указатель на область памяти, где будет сохраняться массив.

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

void far putimage(int left, int top, void far *bitmap, int op);

При этом можно не только указать новое местоположение массива пикселей (через координаты левого верхнего угла), но и вывести его на другую страницу видеопамяти, предварительно сделав ее активной при помощи функции setactivepage. Последний аргумент функции putimage указывает способ, которым атрибуты пикселей массива, выводимого из оперативной памяти на активную страницу, будут замещать уже находящиеся в видеобуфере значения. В простейшем случае, когда op = 0, происходит простое копирование атрибутов пикселей из памяти в видеопамять. Однако возможно выполнение одной из побитовых логических операций над содержимым оперативной памяти и видеобуфера для каждого пикселя массива. Полный набор таких операций задается перечислимым типом putimage_ops:

enum putimage_ops

{COPY_PUT, XOR_PUT, OR_PUT, AND_PUT, NOT_PUT};

При работе с функциями getimage и putimage действуют примерно те же правила относительно задаваемых координат, что и для функций getpixel и putpixel: хотя координаты задаются в системе графического окна, можно указать массив пикселей, расположенный в любом месте в пределах активной страницы. Различие между двумя функциями состоит в том, что getimage “схватит” этот массив, а функция putimage выведет массив на страницу так, как если бы никакого графического окна не существовало (т. е. игнорируется режим отсечения).

Если координаты задаваемого массива пикселей (весь массив или его часть) выходят за пределы страницы, то результат работы функций getimage и putimage непредсказуем.

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

Основное значение графических примитивов – обеспечить наличие программных средств для рисования всевозможных геометрических объектов. Условно можно разбить все графические примитивы по типу рисуемых ими графических объектов на две группы: контурные и площадные. Функции первой группы рисуют всевозможные контурные линии. Ко второй группе относятся функции, предназначенные для рисования геометрических фигур с закрашиванием ограничиваемых ими областей.

К группе контурных графических примитивов относятся функции:

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,intbottom);

void far drawpoly(int num_points,int far *poly_points);

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

void far arc(int x,int y,int start_angle,int end_angle,int radius);

void far ellipse(int x,int y, int start_angle,int end_angle,int x_radius,int y_radius);

Первые пять рисуют кусочно-линейные объекты (в том числе и фигуры, составленные из отрезков прямых), остальные – кривые второго порядка (дуги окружностей и эллипсов).

Функции line, linerel и lineto соединяют две точки плоскости отрезком прямой. Для первой обе соединяемые точки указываются явно своими координатами. Функции linerel и lineto в качестве первой точки используют текущую графическую позицию CP, а вторую выбирают аналогично функциям moverel и moveto, т. е. через приращения координат или по явному указанию. Все три функции пользуются системой координат графического окна. Однако им можно передать координаты любых точек, даже лежащих за пределами страницы. Функция graphresult не сообщает об ошибке, а соединяющая линия проводится правильно. Если для окна установлен режим отсечения, то части линии, выходящие за пределы окна, не заносятся в видеопамять.

Функция rectangle рисует на странице видеопамяти контур прямоугольника по указанным координатам левого верхнего и правого нижнего угла.

Функция drawpoly рисует ломаную линию, соединяя точки на плоскости. В первом аргументе передается количество таких точек, а второй указывает на массив целых чисел. Каждая пара чисел из этого массива интерпретируется как пара координат (x, y) очередной точки. Для того чтобы нарисовать замкнутую ломаную линию (многоугольник), первая и последняя пары элементов массива должны быть одинаковыми.

Функция circle рисует окружность радиусом radius с центром в точке с координатами (x, y). Функция arc и ellipse вычерчивают дуги окружности и эллипса с центром в точке (x, y), соответственно ограниченные углами start_angle и end_engle. Для дуги окружности задается ее радиус radius, а для дуги эллипса радиусы по осям x_radius и y_radius. Оси эллипса всегда предполагаются параллельными осям координат страницы.

Углы, ограничивающие дуги, выражаются в градусах и отмеряются против часовой стрелки от направления, задаваемого осью X страницы. Дуга всегда проводится от угла start_angle к углу end_angle также против часовой стрелки.

Для функций rectangle, drawpoly, circle, arc и ellipse справедливы замечания относительно системы координат и режима отсечения, которые были сделаны относительно функций рисования линий.

С дугами окружностей связана функция

void far getarccoords(struct arccoordstype far *arccoords);

Эта функция возвращает характеристики дуги окружности, построенной при последнем вызове функции arc. Характеристики дуги записываются в переменную *arccoords. Тип этой переменной определен следующим способом:

struct arccoordstype

Характеристики

Тип файла
Документ
Размер
734,37 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов лабораторной работы

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6513
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее