Table Of ContentАлексей Поляков
Санкт-Петербург
«БХВ-Петербург»
2002
УДК 681.3.06 + 800.92Cи
ББК 32.973.26-018
П54А
Поляков А. Ю.
П54А Методы и алгоритмы компьютерной графики в примерах на
Visual C++. — СПб.: БХВ-Петербург, 2002. — 416 с.: ил.
ISBN 5-94157-136-4
В книге представлен курс компьютерной графики. Основное внимание
уделяется вопросам прикладного программирования с использованием
языка Visual C++ и библиотеки MFC. Рассмотрены математические основы
компьютерной графики: преобразования на плоскости и в трехмерном про-
странстве, методы построения кривых и поверхностей, которые могут быть
использованы для визуализации результатов научных расчетов. Значитель-
ный раздел книги посвящен работе с растровой графикой. Описывается
формат BMP, функции сохранения и загрузки растровых изображений.
Обсуждается создание и применение графических фильтров для обработки
изображений. Отдельно рассматривается назначение библиотек OpenGL
и DirectX, приводится пример использования OpenGL для визуализации
трехмерной сцены. Весь изложенный материал иллюстрируется программа-
ми, написанными с использованием объектно-ориентированного стиля.
Для программистов
УДК 681.3.06 + 800.92Cи
ББК 32.973.26-018
Группа подготовки издания:
Главный редактор Екатерина Кондукова
Зам. главного редактора Анатолий Адаменко
Зав. редакцией Анна Кузьмина
Редактор Леонид Кочин
Компьютерная верстка Натальи Караваевой
Корректор Татьяна Звертановская
Дизайн обложки Игоря Цырульникова
Зав. производством Николай Тверских
Лицензия ИД № 02429 от 24.07.00. Подписано в печать 23.05.02.
Формат 70 1001/16. Печать офсетная. Усл. печ. л. 33,54.
Тираж 3000 экз. Заказ №
"БХВ-Петербург", 198005, Санкт-Петербург, Измайловский пр., 29.
Гигиеническое заключение на продукцию, товар № 77.99.02.953.Д.001537.03.02
от 13.03.2002 г. выдано Департаментом ГСЭН Минздрава России.
Отпечатано с готовых диапозитивов
в Академической типографии "Наука" РАН
199034, Санкт-Петербург, 9 линия, 12.
ISBN 5-94157-136-4 © Поляков А. Ю., 2002
© Оформление, издательство "БХВ-Петербург", 2002
ÑÎÄÅÐÆÀÍÈÅ
Предисловие ................................................................................................ 1
На кого рассчитана эта книга ............................................................................. 2
Структура книги ................................................................................................... 2
Обратная связь ..................................................................................................... 3
Благодарности ...................................................................................................... 4
ЧАСТЬ I. ОСНОВЫ КОМПЬЮТЕРНОЙ ГРАФИКИ ................................ 5
Глава 1. Основные понятия машинной графики ............................................ 7
1.1. Цели и задачи машинной графики ............................................................. 7
1.2. Основные понятия и определения .............................................................. 9
1.2.1. Графический формат .............................................................................. 9
1.2.2. Элементы графического файла............................................................ 11
1.2.3. Преобразование форматов ................................................................... 12
1.2.4. Сжатие данных ...................................................................................... 12
1.2.5. Пикселы и цвет ..................................................................................... 13
1.2.6. Палитры цветов ..................................................................................... 14
1.2.7. Цвет. Цветовые модели ........................................................................ 15
1.3. Заключение .................................................................................................. 16
Глава 2. Особенности программирования "под Windows" .............................. 17
2.1. Типы данных в Windows ............................................................................. 20
2.2. Структура Windows-приложения ............................................................... 20
2.3. Создание приложения в MS Visual C++ .................................................. 25
2.4. Основные понятия и принципы объектно-ориентированного
программирования ............................................................................................. 27
2.5. Библиотека Microsoft Foundation Class Library ........................................ 29
2.6. Обработка сообщений ................................................................................ 31
2.7. Заключение .................................................................................................. 34
Глава 3. Создаем первое "графическое" приложение .................................... 35
3.1. Генератор приложений AppWizard. Создание приложения "Painter" ......... 35
3.2. Добавление функций рисования ............................................................... 45
3.3. Использование генератора классов ClassWizard ...................................... 48
IV Ñîäåðæàíèå
3.4. Сохранение рисунков в файл .................................................................... 51
3.5. Создание нового рисунка ........................................................................... 52
3.6. Вывод рисунков на печать и предварительный просмотр ..................... 53
3.7. Заключение .................................................................................................. 55
ЧАСТЬ II. РАБОТА С ВЕКТОРНОЙ ГРАФИКОЙ ..................................... 57
Глава 4. Архитектура приложений Document-View ....................................... 59
4.1. Архитектура приложений Document-View ............................................... 59
4.2. Контекст устройства, графические методы класса CDC ........................ 63
4.3. Модификация программы Painter ............................................................. 65
4.3.1. Решение проблемы вывода на принтер .............................................. 65
4.3.2. Установка режима отображения .......................................................... 66
4.3.3. Установка размеров листа .................................................................... 75
4.3.4. Реализация функций рисования примитивов ................................... 83
Создание базового класса иерархии фигур ............................................... 83
Создание производных классов иерархии фигур ..................................... 91
Модификация класса документа CPainterDoc ........................................... 93
Включение в меню команд добавления фигур ......................................... 94
4.3.5. Сохранение рисунков ........................................................................... 99
4.3.6. Очистка памяти ................................................................................... 103
4.4. Заключение ................................................................................................ 104
Глава 5. Математический аппарат алгоритмов компьютерной графики ....... 105
5.1. Векторы ...................................................................................................... 105
5.1.1. Свойства векторов ............................................................................... 106
5.1.2. Скалярное произведение векторов ................................................... 107
5.1.3. Векторное произведение векторов .................................................... 108
5.2. Детерминанты ............................................................................................ 109
5.2.1. Свойства детерминантов .................................................................... 110
5.3. Однородные координаты ......................................................................... 111
5.4. Использование однородных координат ................................................. 112
5.5. Преобразования на плоскости ................................................................. 113
5.6. Матричная форма записи двумерных преобразований ........................ 115
5.7. Заключение ................................................................................................ 116
Глава 6. Реализация функций редактирования рисунков ............................. 117
6.1. Выбор фигуры ........................................................................................... 117
6.2. Маркировка активной фигуры ................................................................ 120
6.3. Рисование полигональных фигур ............................................................ 122
6.4. Рисование фигур произвольных размеров ............................................. 126
6.5. Рисование инверсным цветом ................................................................. 130
6.6. Реализация преобразований на плоскости ............................................ 133
6.7. Определение реакций на нажатие клавиш ............................................ 135
Ñîäåðæàíèå V
6.8. Изменение порядка наложения фигур ................................................... 139
6.9. Удаление фигур ......................................................................................... 144
6.10. Преобразование формата ....................................................................... 145
6.11. Листинг программы ................................................................................ 147
6.11.1. Файл PainterDoc.h ............................................................................. 147
6.11.2. Файл PainterDoc.cpp ......................................................................... 149
6.11.3. Файл PainterView.h ............................................................................ 156
6.11.4. Файл PainterView.cpp ........................................................................ 159
6.11.5. Файл Shapes.h .................................................................................... 172
6.11.6. Файл Shapes.cpp ................................................................................. 175
6.11.7. Файл Global.h ..................................................................................... 182
6.11.8. Файл Global.cpp ................................................................................. 182
6.12. Заключение .............................................................................................. 183
Глава 7. Преобразования в трехмерном пространстве ................................. 185
7.1. Перенос и поворот в трехмерном пространстве ................................... 185
7.2. Параллельная проекция ........................................................................... 187
7.2.1. Видовое преобразование .................................................................... 188
7.2.2. Перспективные преобразования ....................................................... 191
7.3. Два основных подхода к удалению невидимых линий
и поверхностей ................................................................................................. 191
7.3.1. Алгоритм отсечения нелицевых граней ............................................ 192
7.3.2. Алгоритм Робертса .............................................................................. 192
7.3.3. Алгоритм z-буфера .............................................................................. 193
7.3.4. Алгоритм Варнака ............................................................................... 194
7.3.5. Алгоритм построчного сканирования............................................... 195
7.4. Программная реализация преобразований
в трехмерном пространстве ............................................................................. 195
7.5. Рисуем трехмерную поверхность ............................................................ 205
7.5.1. Построение линий уровня на поверхности ..................................... 210
7.6. Заключение ................................................................................................ 219
Глава 8. Построение кривых ..................................................................... 221
8.1. Определения .............................................................................................. 221
8.2. Параметрическое задание кривых ........................................................... 224
8.3. Сплайновые кривые .................................................................................. 225
8.3.1. Интерполяционная кривая Catmull-Rom ......................................... 226
8.3.2. Элементарная Бета-сплайновая кривая ............................................ 226
8.3.3. Сплайновая кривая Безье ................................................................... 227
8.4. Построение сплайновой кривой Безье с помощью средств MFC ...... 229
8.5. Программная реализация построения сплайновых кривых ................ 229
8.6. Заключение ................................................................................................ 239
VI Ñîäåðæàíèå
ЧАСТЬ III. РАБОТА С РАСТРОВОЙ ГРАФИКОЙ .................................. 241
Глава 9. Работа с растровыми ресурсами ................................................... 243
9.1. Ресурсы ....................................................................................................... 243
9.2. Пиктограммы приложения ...................................................................... 244
9.3. Изображение панели инструментов ....................................................... 248
9.4. Курсор ........................................................................................................ 248
9.5. Растровое изображение Bitmap ............................................................... 255
9.6. Универсальная функция загрузки графических ресурсов .................... 264
9.7. Заключение ................................................................................................ 267
Глава 10. Экспорт изображений в BMP-файл ............................................ 269
10.1. Общее описание формата BMP ............................................................. 269
10.2. Структура файла ...................................................................................... 270
10.3. Экспорт рисунков в растровый файл формата BMP .......................... 274
10.4. Заключение .............................................................................................. 281
Глава 11. Просмотр и редактирование растровых изображений .................. 284
11.1. Создание многодокументного приложения ......................................... 284
11.2. Класс CRaster для работы с растровыми изображениями .................. 285
11.3. Модификация класса документа для обеспечения работы с
изображениями ................................................................................................. 295
11.4. Использование виртуального экрана .................................................... 297
11.5. Модификация класса облика ................................................................. 299
11.6. Редактирование изображений ................................................................ 301
11.6.1. Гистограмма яркости изображения ................................................. 303
11.6.2. Программная схема выполнения преобразований.
Графические фильтры .................................................................................. 310
11.6.3. Таблица преобразования .................................................................. 313
11.6.4. Класс "Фильтр" .................................................................................. 314
11.6.5. Использование гистограммы яркости для повышения
контрастности изображения. Фильтр "Гистограмма" ............................... 319
11.6.6. Фильтр "Яркость/Контраст" ............................................................. 325
11.6.7. Фильтр "Инверсия цветов" ............................................................... 332
11.6.8. Фильтр "Рельеф" ................................................................................ 333
11.6.9. Фильтр "Размытие" ........................................................................... 335
11.6.10. Фильтр "Контур" .............................................................................. 337
11.6.11. Фильтр "Четкость" ........................................................................... 338
11.6.12. Применение фильтров .................................................................... 340
11.7. Вывод изображений на печать ............................................................... 341
11.8. Листинг программы ................................................................................ 344
11.9. Заключение .............................................................................................. 365
Ñîäåðæàíèå VII
ЧАСТЬ IV. НАЗНАЧЕНИЕ ГРАФИЧЕСКИХ БИБЛИОТЕК .................... 367
Глава 12. Библиотеки OpenGL и DirectX ................................................... 369
12.1. Библиотека OpenGL ............................................................................... 369
12.2. Библиотека DirectX ................................................................................. 372
12.3. Пример использования библиотеки OpenGL ...................................... 373
12.3.1. Модификация класса облика ........................................................... 375
12.3.2. Модификация класса документа ..................................................... 383
12.3.3. Модификация класса приложения ................................................. 383
12.4. Заключение .............................................................................................. 384
Заключение .............................................................................................. 385
ЧАСТЬ V. ПРИЛОЖЕНИЕ...................................................................... 387
Приложение. Описание содержимого компакт-диска .................................. 389
Список литературы ................................................................................... 391
Интернет-ресурсы ............................................................................................ 393
Предметный указатель .............................................................................. 395
VIII Ñîäåðæàíèå
Моему брату
Ïðåäèñëîâèå
Эта книга представляет собой курс основ компьютерной графики. Здесь из-
ложены алгоритмы и методы решения многих задач, возникающих при ра-
боте с векторными и растровыми изображениями. Основное внимание уде-
лено вопросам прикладного программирования с использованием языка
Microsoft Visual C++ и MFC. Материал книги накоплен за несколько лет
чтения курса лекций "Компьютерная графика" в Томском государственном
университете систем управления и радиоэлектроники (ТУСУР), а также
в результате практической работы над несколькими научными и коммерче-
скими проектами.
Основная цель книги — показать, как можно запрограммировать ту или
иную задачу компьютерной графики: построить сплайновую кривую, нари-
совать поверхность, отобразить на этой поверхности линии уровня, управ-
лять несколькими объектами-фигурами в программе, сохранить изображе-
ние, считать растровое изображение с диска, обработать и записать обратно
на диск, распечатать изображение на принтере.
Другая задача — продемонстрировать различные пути и способы достиже-
ния одинаковых результатов. Поэтому при изучении материала книги ста-
райтесь всегда находить новые, более удачные варианты решения рассмот-
ренных задач.
Весь теоретический материал книги иллюстрируется рабочими примерами
программ. В качестве языка программирования выбран С++, поскольку он
представляется наиболее подходящим для решения серьезных задач компь-
ютерной графики. В примерах применяется объектно-ориентированный
стиль программирования (ООП). Используя стиль ООП, легко представить
программу в виде отдельных частей (модулей, деталей), взаимодействующих
между собой, если же вы склонны к философствованию, то можно мыслить
о программе, как о сообществе неких индивидуумов, которые могут рож-
даться, обретать какие-то свойства, общаться между собой и умирать.