| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Часть IV. ГРАФИКА
ГЛАВА 4 -- 1 --
-------
ГРАФИКА
-----------------------------------------------------------------
В этой главе приводится базовый набор функций графики,
которые позволяют рисовать (отображать на экране) точки, линии,
прямоугольники, окружности, используя возможности графических
адаптеров CGA или EGA. Эти программы используются как основа, на
которой строятся функции графики более высокого уровня. Для более
детального изучения этих базовых графических функций предлагается
книга "С: The Complete Reference" Herb Schild (Osborn /
McGrow-Hall, 1987).
Помимо краткого представления базовых функций графики, в
этой главе приводятся следующие программы:
- сохранение графических изображений в файле на диске;
- загрузка графических изображений из файла;
- вращение объектов в двумерном пространстве;
- копирование или пересылка графических изображений.
В конце главы привевен текст "программы-художника",
позволяющей рисовать на экране терминала, с использованием клавиш
перемещения курсора.
По мере возрастания вашего опыта по использованию функций
графики, вы сможете самостоятельно разрабатывать хорошие
программы. Например, используя функции сохранения и загрузки
графических изображений, вы сможете создавать графики или
диаграммы и успешно использовать их в случае необходимости.
Используя функции вращения изображений объектов, вы сможете
разрабатывать программы "звездных войн" - образец "живой"
графики, которые будут представлять большой интерес для вас. Вы
сможете также, использовать эти функции как основу для
использования систем автоматизированного проектирования (CAD/CAM
system).
Для корректного использования программ, описаных в этой
главе, вам необходимы компьютеры типа IBM PC XT, IBM PC AT или
другие совместимые с ними модели, снабженные графическими
адаптерами CGA или EGA. Все программы, приведенные в данной
главе, кроме программ изображения точки, аппаратно-независимы, и
вы можете с минимальными усилиями сделать их рабочими на других
типах графических машин.
Глава IV -- 2 --
ВИДЕОРЕЖИМЫ И ЦВЕТОВАЯ ПАЛИТРА
-----------------------------------------------------------------
Перед использованием каких-либо функций графики компьютер
должен быть переведен в соответствующий видеорежим. Для
компьютеров типа IBM PC это означает, что должны быть выбраны
подходящие режим и палитра.
В таблице 4-1 приведены различные видеорежимы, в которых
могут работать компьютеры IBM PC. Для функций, приведенных в
этой главе, требуется 4 видеорежим, предполагающий использование
цветного графического дисплея с размерностью экрана 320 на 200.
Хотя адаптер EGA поддерживает и режимы с расширенной разрешающей
способностью дисплея, 4 видеорежим выбран в качестве базового для
разработки и использования функций графики в связи с тем, что он
поддерживается как адаптером EGA, так и CGA. Использование особых
режимов EGA требует только изменения функций записи точки (смотри
книгу по использованию графики в EGA "Advance Grafics in C"
Nelson Jobson Osborn/McGrow-Hall, 1987). Вам необходимо
запомнить, что во всех кодах верхний левый угол имеет координаты
0,0.
BIOS-прерывание 16, функция 0, устанавливает видеорежим и
используется в функции mode(), текст которой приведен ниже. Но
прежде чем вы ознакомитесь с ней, предлагаем вам внимательно
изучить все видеорежимы, поддерживаемые соответствующими
адаптерами. Для этого обратитесь к таблице 4-1.
Таблица 4-1 Режимы терминала для машин IBM PC
-----------------------------------------------------------------
Режим Тип Размерность Адаптер
экрана
-----------------------------------------------------------------
0 алфавитно-цифровой, ч/б 40х25 CGA, EGA
1 алфавитно-цифровой, 16 цв. 40х25 CGA, EGA
2 алфавитно-цифровой, ч/б 80х25 CGA, EGA
3 алфавитно-цифровой, 16 цв. 80х25 CGA, EGA
4 графический, 4 цвета 320х200 CGA, EGA
5 графический, 4 серых тона 320х200 CGA, EGA
6 графический, ч/б 640х200 CGA, EGA
7 алфавитно-цифровой, ч/б 80х25 монохромный
8 графический, 16 цветов 160х200 PCjr
9 графический, 16 цветов 320х200 PCjr
10 графический, 4 цвета-PCjr 640х200 PCjr, EGA
16 цветов-EGA
13 графический, 16 цветов 320х200 EGA
14 графический, 16 цветов 640х200 EGA
15 графический, 4 цвета 640х350 EGA
-----------------------------------------------------------------
А теперь приведем текст функции mode().
Глава IV -- 3 --
/* Установка видеорежима */
void mode(mode_code)
int mode_code;
{
union REGS r;
r.h.al = mode_code;
r.h.ah = 0;
int86(0x10,&r,&r);
}
В 4-ом режиме доступны две палитры (набора цветов). Каждая
палитра определяет четыре цвета, отображаемые на экране
терминала. В IBM PC палитра 0 определяет желтый, зеленый и
красный цвета, палитра 1 определяет белый, ярко-красный
(пурпурный) и голубой цвета. Для каждой палитры четвертым цветом
является цвет фона, который обычно черный. BIOS-прерывание 16,
функция 11, устанавливает палитру.
Функция pallet(), приведенная ниже, устанавливает номер
палитры, который задается в качестве значения ее аргумента:
/* Установка палитры */
void palette(pnum)
int pnum;
{
union REGS r;
r.h.bh=1; /* код 4 графического режима */
r.h.bl=pnum; /* номер палитры */
r.h.ah=11; /* устанавливается для вызова палитры */
int86(0x10,&r,&r);
}
Глава IV -- 4 --
ЗАПИСЬ ТОЧКИ РАСТРА
-----------------------------------------------------------------
Одной из основных программ графики является программа записи
точки растра - наименьшей адресуемой точки на экране дисплея. В
данном случае термин "точка растра" будет использоваться для
описания наименьшей адресуемой точки в отдельных графических
режимах. Так как функция записи точки растра используется в
других программах более высокого уровня, ее эффективность очень
важна для быстродействия программ верхних уровней, которые
непосредственно реализуют функции графики. На IBM PC и
совместимых с ними компьютерах существуют два способа вывода
информации с использованием точек растра. Первый способ,
использующий прерывания ROM-BIOS, является наиболее простым, но и
наименее быстродействующим (слишком медленным для наших целей).
Вторым и более быстродействующими способом является размещение
информации непосредственно в видеопамяти дисплея (ROM). Именно
этот метод и рассматривается ниже.
Глава IV -- 5 --
Работа адаптеров CGA/EGA в графическеом режиме
----------------------------------------------
Адаптер CGA всегда располагается в видеопамяти по адресу
8000000h. Адаптер EGA имеет аналогичное расположение для тех
режимов, которые совместимы с режимами CGA (более полную
информацию о аппаратных средствах поддержки графики вы можете
получить в руководстве "IBM Technical Reference"). В 4
графическом режиме каждый байт содержит информацию о цвете для 4
точек растра (для каждой точки растра по 2 бита). Следовательно,
для работы с экраном размерностью 320 на 200 требуется 16К
памяти. Так как два бита могут содержать только 4 различных
значения, в 4 видеорежиме поддерживаются только 4 цвета. Значение
каждого двухбитового блока определяет цвет в соответствии с
таблицей, приведенной ниже:
---------------------------------------------------
Значение Цвет в палитре 0 Цвет в палитре 1
---------------------------------------------------
фон фон
1 желтый голубой
2 красный пурпурный
3 зеленый булый
---------------------------------------------------
Особенность адаптера CGA заключается в том, что четные точки
растра будут располагаться по адресу B8000000h, а нечетные - на
2000h (8152 - в десятичном виде) байтов выше, т.е. по адресу
B8002000h. Следовательно, каждая строка точек растра требует 80
байтов (40 для четных точек растра, 40 - для нечетных). Внутри
каждого байта точки располагаются слева направо, как они
появляются на экране терминала. Это означает, что точка растра с
номером 0 занимает 6 и 7 биты, в то время, как точка растра с
номером 3 - 0 и 1 биты.
Так как каждый байт кодирует значение четырех точек растра,
вы должны сохранять значение трех точек при изменении одной из
них. Лучший способ сделать это - создание битовой маски со всеми
битами, установленными в 1, кроме тех, которые будут изменяться.
Значение битовой маски складывается по схеме "И" с действительным
значением байта, а затем полученное значение складывается по
схеме "ИЛИ" с новым значением. Однако ситуация несколько
меняется, если вы хотите сложить по схеме "НЕ-ИЛИ" новое и старое
значения. В этом случае вы просто складываете по схеме "ИЛИ"
старое значение байта с 0, а затем складываете по схеме "НЕ-ИЛИ"
новое двоичное представление цвета и получаете результат. Адрес
требуемого байта определяется путем умножения значения координаты
X на 40, а затем добавляется значение координаты Y, деленное на
4. Для того,чтобы определить, находится ли точка растра в четном
или нечетном блоке памяти, используется остаток от деления
значения координаты Х на 2. Если остаток равен 0, блок является
четным (используется первый блок), в противном случае - блок
нечетный (используется второй блок). Требуемые биты внутри байта
вычисляются путем выполнения деления по модулю 4. Остаток
Глава IV -- 6 --
определяет номер двухбитового пакета, который содержит информацию
о требуемых точках растра. Для установки байта режима цвета и
битовой маски используются операторы побитового сдвига. Хотя
манипулирование битами в функции mempoint() несколько запутано,
вы, однако, без труда разберетесь в ней, если тщательно изучите
что именно и как она делает.
/* Запись точки в CGA/EGA */
void mempoint(x,y,color_code)
int x,y,color_code;
{
union mask {
char c[2];
int i;
} bit_mask;
int i,index,bit_position;
unsigned char t;
char xor; /* "НЕ-ИЛИ" цвета в случае его изменения */
char far *ptr=(char far *) 0xB8000000; /* точка в памяти
CGA */
bit_mask.i=0xFF3F; /* 11111111 00111111 в двоичном коде */
if (x<0 || x>199 || y<0 || y>319) return;
xor=color_code & 128; /* проверка, устанавливался ли
режим "НЕ-ИЛИ" */
color_code=color_code & 127; /* маска старших битов */
/* установка битовой маски и битов режима цвета
в правую позицию */
bit_position=y%4; /* вычисление нужной позиции
в байте */
color_code<<=2*(3-bit_position); /* сдвиг кода цвета
в нужную позицию */
bit_mask.i>>=2*bit_position; /* сдвиг битовой маски в
нужную позицию */
/* определение требуемого байта в памяти терминала */
index=x*40+(y%4);
if (x%2) index+=8152; /* если нечетный, используется
второй блок */
/* запись цвета */
if (!xor) { /* режим изменения цвета */
t=*(ptr+index) & bit_mask.c[0];
*(ptr+index)=t|color_code;
}
else {
t=*(ptr+index) | (char)0;
*(ptr+index)=t & color_code;
}
}
Глава IV -- 7 --
Заметим, что тип указателя видеопамяти объявлен как far; это
необходимо, если вы транслируете в модели маленькой (small)
памяти. Вы так же должны заметить, что специальный маркер режима
записи XOR, определенный в функциях ROM-BIOS, используется и в
функции mempoint().
Глава IV -- 8 --
ВЫЧЕРЧИВАНИЕ ЛИНИЙ
-----------------------------------------------------------------
Функции вычерчивания линий являются основными подпрограммами
графики и используются для отображения линий в заданном цвете
путем задания ее начальных и конечных координат. В то время, как
изображение вертикальных и горизонтальных линий не представляет
особого труда, более трудной задачей является создание функций,
которые рисуют линии вдоль диагоналей. Например, какие точки
составляют линию, вычерчиваемую от точки с координатами 0,0 до
точки с координатами 80,120?
Один из подходов к разработке функций вычерчивания линий
использует отношение между смещением по координатам X и Y. Чтобы
показать этот подход в действии, проведем линию между точками с
координатами 0,0 и 5,10. Смещение по X равно 5, а по Y - 10.
Отношение равно 1/2. Оно будет использоватся при определении
коэффициента зависимости, по которому должны меняться координаты
X и Y при изображении линий. В данном случае это означает, что
приращение координаты X составляет половину величины изменения
координаты Y. Начинающий программист часто использует этот метод
при разработке функций вычерчивания линий. Хотя такой подход
математически верен и прост для понимания, для его правильной
работы и для того, чтобы избежать серьезных ошибок округления,
необходимо использовать математические операции с числами с
плавающей точкой. Это означает, что функции вычерчивания линий
будут работать довольно медленно, если в систему не будет включен
математический сопроцессор (например - Intel 8087). По этой
причине этот метод используется довольно редко.
Наиболее общий метод изображения линий включает
использование алгоритма Брезенхама. Хотя основой в нем служит
также отношение между расстояниями по координатам X и Y, в данном
случае не требуется выполнять деление или вычисление чисел с
плавающей точкой. Вместо этого, отношение между значениями
координат X и Y представляется косвенным образом через серии
сложений и вычитаний. Основной идеей алгоритма Брезенхама,
является регистрация средних значений погрешностей между
идеальным положением каждой точки и той позицией на экране
дисплея, в которой она действительно отображается. Погрешность
между идеальным и действительным положением точки возникает ввиду
ограниченных возможностей технических средств. Фактически не
существует дисплеев с бесконечно большой разрешающей
способностью, и, следовательно, действительное положение каждой
точки на линии требует наилучшей аппроксимации. В каждой итерации
цикла вычерчивания линии вызываются две переменные xerr и yerr,
которые увеличиваются в зависимости от изменения величин
координат X и Y соответственно. Когда значение погрешности
достигает определенного значения, оно вновь устанавливается в
исходное положение, а соответствующий счетчик координат
увеличивается. Этот процесс продолжается до тех пор, пока линия
не будет полностью вычерчена. Функция line(), приведенная ниже,
реализует этот метод. Вы должны изучать ее до тех пор, пока не
поймете механизма выполнения всех ее операций. Заметим, что в ней
Глава IV -- 9 --
используется функция mempoint(), разработанная ранее для
отображения точки на экране терминала.
/* Вычерчивание линии заданного цвета с использованием
алгоритма Брезенхама */
void line(startx,starty,endx,endy,color)
int startx,starty,endx,endy,color;
{
register int t,distаnce;
int xerr=0,yerr=0,delta_x,delta_y;
int incx,incy;
/* вычисление расстояния в обоих направлениях */
delta_x=endx-startx;
delta_y=endy-starty;
/* определение направления шага,
шаг вычисляется либо по вертикальной, либо горизонтальной
линии */
if (delta_x>0) incx=1;
else if (delta_x==0) incx=0;
else incx= -1;
if (delta_y>0) incy=1;
else if (delta_y==0) incy=0;
else incy= -1;
/* определение какое расстояние больше */
delta_x=abs(delta_x);
delta_y=abs(delta_y);
if (delta_x>delta_y) distance=delta_x;
else distance=delta_y;
/* вычерчивание линии */
for (t=0; t<=distance+1; t++) {
mempoint(startx,starty,color);
xerr+=delta_x;
yerr+=delta_y;
if (xerr>distance) {
xerr-=distance;
startx+=incx;
}
if (yerr>distance) {
yerr-=distance;
starty+=incy;
}
}
}
Глава IV -- 10 --
ИЗОБРАЖЕНИЕ И ЗАКРАШИВАНИЕ ПРЯМОУГОЛЬНИКОВ
-----------------------------------------------------------------
Если у вас есть функции вычерчивания линий, то не составит
особого труда создать функции вычерчивания прямоугольников.
Пример, приведенный здесь, вычерчивает прямоугольники в заданном
цвете путем задания координат двух противоположных углов.
/* Вычерчивание прямоугольника */
void box(startx,starty,endx,endy,color_code)
int startx,starty,endx,endy,color_code;
{
line(startx,starty,endx,starty,color_code);
line(startx,starty,startx,endy,color_code);
line(startx,endy,endx,endy,color_code);
line(endx,starty,endx,endy,color_code);
}
Для того, чтобы закрасить прямоугольник, требуется
выполнить запись в каждую точку растра внутри прямоугольника.
Программа fill_box(), приведенная ниже, закрашивает
прямоугольник, определенный координатами двух противоположных
углов, заданным цветом. В ней используется функция line(),
задающая цвет внутри прямоугольника.
/* Закрашивание прямоугольника в заданный цвет */
void fill_box(startx,starty,endx,endy,color_code)
int startx,starty,endx,endy,color_code;
{
register int i,begin,end;
begin=startxРубрика: Cи для профессионалов
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи:
|