Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Программирование графики на С++. Теория и примеры

Покупка
Основная коллекция
Артикул: 637286.07.01
К покупке доступен более свежий выпуск Перейти
В пособии рассматриваются основные методы и алгоритмы построения графических изображений. Подробно анализируются приемы моделирования движения (анимации) двумерных изображений, рассматриваются алгоритмы трехмерной графики, построение сплайнов и сплайновых поверхностей, основы работы в графической библиотеке OpenGL. Каждое теоретическое положение компьютерной графики исследуется на примерах программ, написанных на С++. Особое внимание уделено взаимодействию программ с операционной системой Windows. Все примеры апробированы в среде разработки проектов Visual Studio 2008. Пособие соответствует требованиям Федерального государственного образовательного стандарта высшего образования последнего поколения. Для студентов, обучающихся по направлению подготовки 09.04.04 «Программная инженерия», и всех интересующихся программированием графики.
49
158
359
465

Только для владельцев печатной версии книги: чтобы получить доступ к дополнительным материалам, пожалуйста, введите последнее слово на странице №262 Вашего печатного экземпляра.

Корнеев, В. И. Программирование графики на С++. Теория и примеры : учебное пособие / В.И. Корнеев, Л.Г. Гагарина, М.В. Корнеева. — Москва : ФОРУМ : ИНФРА-М, 2021. — 517 с. + Доп. материалы [Электронный ресурс]. — (Высшее образование: Бакалавриат). — www.dx.doi.org/10.12737/23113. - ISBN 978-5-8199-0837-2. - Текст : электронный. - URL: https://znanium.ru/catalog/product/1222414 (дата обращения: 22.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
ПРОГРАММИРОВАНИЕ 
ГРАФИКИ НА С++

ТЕОРИЯ И ПРИМЕРЫ

В.И. Корнеев
Л.Г. Гагарина
М.В. Корнеева

УЧЕБНОЕ ПОСОБИЕ

Москва 
ИД «ФОРУМ» — ИНФРА-М
2021

Рекомендовано федеральным государственным автономным образовательным 
учреждением высшего образования «Национальный исследовательский университет 
"Московский институт электронной техники"» в качестве учебного пособия для студентов, обучающихся по направлению подготовки 09.04.04 «Программная инженерия» 
и группам направлений 11.03.04 «Электроника и наноэлектроника» и 11.03.02 
«Инфокоммуникационные технологии и системы связи»

А в т о р ы:
Виктор Иванович Корнеев, кандидат физико-математических наук, доцент 
Национального исследовательского университета «Московский институт 
электронной техники» (НИУ «МИЭТ») (гл. 1, 4 в соавторстве с Л.Г. Гагариной; 
гл. 2, 6 в соавторстве с М.В. Корнеевой; гл. 3, 5);
Лариса Геннадьевна Гагарина, доктор технических наук, профессор, профессор НИУ «МИЭТ» (гл. 1, 4 в соавторстве с В.И. Корнеевым);
Мария Викторовна Корнеева, аспирант НИУ «МИЭТ» (гл. 2, 6 в соавторстве 
с В.И. Корнеевым)

УДК 004.42(075.8)
ББК 32.973-018я73
 
К67

Корнеев В.И.
К67  
Программирование графики на С++. Теория и примеры : учебное 
пособие / В.И. Корнеев, Л.Г. Гагарина, М.В. Корнеева. — Москва : 
ИД «ФОРУМ» : ИНФРА-М, 2021. — 517 с. + Доп. материалы [Электронный ресурс]. — (Высшее образование: Бакалавриат). — DOI 
10.12737/23113.

ISBN 978-5-8199-0837-2 (ИД «ФОРУМ») 
ISBN 978-5-16-014415-3 (ИНФРА-М, print) 
ISBN 978-5-16-106928-8 (ИНФРА-М, online)

В пособии рассматриваются основные методы и алгоритмы построения 
графических изображений. Подробно анализируются приемы моделирования движения (анимации) двумерных изображений, рассматриваются 
алгоритмы трехмерной графики, построение сплайнов и сплайновых поверхностей, основы работы в графической библиотеке OpenGL. Каждое 
теоретическое положение компьютерной графики исследуется на примерах программ, написанных на С++. Особое внимание уделено взаимодействию программ с операционной системой Windows. Все примеры апробированы в среде разработки проектов Visual Studio 2008.
Пособие соответствует требованиям Федерального государственного 
образовательного стандарта высшего образования последнего поколения.
Для студентов, обучающихся по направлению подготовки 09.04.04 
«Программная инженерия», и всех интересующихся программированием 
графики.
УДК 004.42(075.8)
ББК 32.973-018я73

Р е ц е н з е н т:
Т.Ю. Крупкина, доктор технических наук, профессор кафедры интегральной 
электроники и микросхем НИУ «МИЭТ» 

ISBN 978-5-8199-0837-2 (ИД «ФОРУМ») 
ISBN 978-5-16-014415-3 (ИНФРА-М, print) 
ISBN 978-5-16-106928-8 (ИНФРА-М, online)

© Корнеев В.И., Гагарина Л.Г., 
Корнеева М.В., 2016
© ИД «ФОРУМ», 2016

Материалы, отмеченные знаком 
, доступны 
в электронно-библиотечной системе Znanium.com

Предисловие

Настоящая книга является введением в программирование компьютерной графики и предназначается в первую очередь для студентов, специализирующихся в программировании. Материал излагается с точки зрения программиста, и все методы и алгоритмы компьютерной графики представлены таким образом, чтобы можно 
было легко написать соответствующий код программы. Для лучшего 
восприятия этого курса желательно уметь, хотя бы немного, программировать на алгоритмическом языке программирования C++. 
Однако множество примеров в этом курсе могут помочь и новичку 
в изучении языка C++.
Материал учебного пособия в значительной степени соответствует курсу «Интерактивные графические системы», который один 
из авторов читал много лет в Московском институте электронной 
техники (МИЭТ) для студентов 4-го курса по специальности «Программное обеспечение вычислительной техники и автоматизированных систем».
Книга является продолжением пособия В.И. Корнеева «Интерактивные графические системы» (М.: БИНОМ. Лаборатория знаний, 
2009. 232 с.). Пособие было в значительной степени переработано 
и дополнено новым материалом, убраны материалы, связанные 
с программированием графики в устаревшей операционной системе 
DOS, введена глава, посвященная алгоритмам трехмерной графики.
В процессе преподавания программирования компьютерной графики сложилось убеждение, что для студентов, начинающих изучать 
основы программирования компьютерной графики и желающих 
глубже понять не только методы и алгоритмы компьютерной графики, но также соответствие этих алгоритмов архитектуре компьютера и особенностям операционной системы, лучше всего подходит 
стиль программирования, который обычно называют API-программированием. Это связано с тем, что важным моментом при разработке программ является изучение и использование особенностей 
операционной системы.
В настоящее время популярен стиль программирования, основанный на использовании высокоуровневых библиотек, созданных 
различными фирмами для нужд разработчиков графических приложений. Однако если использовать высокоуровневые библиотеки, 
то исчезает возможность напрямую обращаться к системным 
функциям операционной системы. Например, известные биб
лиотеки MFC и OWL прячут детали функционирования Windows, 
и работа программиста сводится к изучению библиотеки и соответствующего инструментария. Напротив, API-программирование позволяет напрямую использовать возможности операционной 
системы.
Аббревиатура API соответствует набору программных средств, 
которые обычно называют Application Program Interface — интерфейс 
прикладного программирова ния. Это те программные средства, которые предоставляются операционной системой для использования 
прикладными программами. Системные функции, которые Windows 
предоставляет программисту, называют также API-функциями. 
В книге для разработки программ используются функции API 
Windows без посредничества высокоуровневых библиотек общего 
назначения. Это не значит, что авторы предпочитают стиль API-программирования, отвергая использование высокоуровневых библиотек. Напротив, если опытный программист работает над созданием приложения большого объема, то использование, например, 
библиотеки классов MFC может только ускорить работу. Однако на 
начальной стадии обучения программированию графики больше 
подходит стиль использования API-функций. 
Книга разбита на шесть глав, в которых авторы постарались осветить все основные принципы программирования компьютерной 
графики. По каждой главе приводится большое число действующих 
программ. Даются исходные коды в файлах *.cpp, файлы ресурсов 
*.rc, заголовочные файлы *.h, bmp-файлы *.bmp и исполняемые 
файлы *.exe.

глава 1 
Создание Программ ПоСТроения 
графиков c иСПользованием 
графичеСких ПримиТивов API WIndoWs. 
Создание меню для оТображения 
различных графичеСких объекТов

1.1. мировые и экранные координаТы

Графическое отображение объектов реального мира на экране 
компьютера требует сначала координатного описания этих объектов 
в том пространстве, где они существуют. Если объект — летящий 
самолет, движущийся автомобиль, неподвижное здание, то описание 
объекта нужно проводить в трехмерной декартовой системе координат, где каждая точка объекта характеризуется тремя координатами 
( , , )
x y z .
При проецировании объекта трехмерного мира в графический 
объект на экране компьютера в теории и практике компьютерной 
графики используется направление, которое называют 3D-графикой. 
Если объект находится в плоскости или двигается в плоскости, то его 
положение на плоскости можно описать в двумерной системе координат, где каждая точка объекта характеризуется двумя координатами 
( , )
x y . Этот раздел компьютерной графики называют 2D-графикой.
Часто результаты измерения физических величин в различных 
процессах или данные экономической деятельности предприятия 
в течение определенного периода времени удобно представить в графическом виде. Когда не было компьютеров, эти графические зависимости рисовались на листе бумаги, который представлял собой 
двумерный объект, и в этом случае для построения графика требовалась двумерная система координат.
В качестве горизонтальной координаты можно взять время, в качестве вертикальной — напряжение на клеммах генератора, а затем 
можно построить график зависимости напряжения от времени. 
Таким образом, в качестве горизонтальных и вертикальных координат могут использоваться самые разные параметры рассматриваемого процесса.

Вне зависимости от природы процесса, каждая точка графика 
характеризуется двумя числами, координатами этой точки. При 
отображении таких двумерных картин на экране компьютера используются приемы и алгоритмы 2D-графики. В дальнейшем, независимо от реального смысла координат, двумерные координаты всегда 
будем обозначать как ( , )
x y .
Координатная система, в которой описываются реальные объекты или процессы, будем называть мировой системой координат. 
Мировая система координат может быть трехмерной, и тогда для 
графического отображения объектов на экране компьютера используют 3D-графику. Мировая система координат может иметь два измерения, и тогда двумерные объекты будут отображаться на экране 
компьютера с помощью 2D-графики.
Начнем рассмотрение с двумерной мировой системы координат. 
На рис. 1.1 (
) изображен график функции y
x
= sin( ) в мировой 
системе координат.

рис. 1.1. Мировая система координат и поле вывода

Прежде чем переносить график на экран компьютера, следует 
учесть, что график будет располагаться в пределах поля вывода, размеры которого обычно меньше размеров экрана. В мировой системе 
координат поле вывода можно определить, задав координаты левого 
нижнего угла (xLeft, yBottom) и координаты правого верхнего угла 
(xRight, yTop). На рис. 1.1 поле вывода имеет следующие размеры: 
xLeft = -2, xRight = 10, yBottom = -2, yTop = 2.
Размерность мировых координат зависит от рассматриваемой задачи. Если речь идет о пространственном расположении графического объекта, то размерность координат совпадает с размерностью 
длины, и в этом случае единицей измерения являются метры или 
километры. Если же в мировых координатах изображается процесс, 

то координата x может быть временем и измеряться в секундах, а координата y может быть током и измеряться в амперах.
Для работы с экраном компьютера введем специальную систему 
координат, которая связана с устройством вывода — экраном компьютера, принтером и т.д. На рис. 1.2 (
) показаны экран компьютера и оси экранной системы координат. 

рис. 1.2. Экран компьютера и экранная система координат

Начало экранной системы координат (0, 0) располагается в левом 
верхнем углу экрана. Ось n направлена слева направо, ось m — сверху 
вниз (см. рис. 1.2). В качестве единицы измерения в данной системе 
координат используется пиксель.
Поле вывода можно расположить в любом месте экрана, задав 
в экранной системе координат координаты левого нижнего угла 
(nLeft, mBottom) и координаты правого верхнего угла 
(nRight, mTop).
Необходимо сопоставить каждой точке A в мировых координатах 
(x, y) соответствующую точку A в экранных координатах (n, m). Для 
перехода от мировой системы координат к экранной системе координат обычно выбирают линейный закон преобразования координат. 
Это линейное преобразование должно удовлетворять единственному 
требованию, чтобы углы поля вывода в мировой системе координат 
соответствовали углам поля вывода в экранной системе координат. 
Запишем это линейное преобразование.

n = (x - xLeft)/(xRight - xLeft)*(nRight - nLeft) + 
+ nLeft;
m = (y - yBottom)/(yTop - yBottom)*(mTop - mBottom) + 
+ mBottom;

В этом случае мировые координаты (x, y) точки A будут изменяться в пределах

 
xLeft
x
xRight
yBottom
y
yTop
≤
≤
≤
≤
,
.

Экранные координаты (n, m) точки A будут изменяться соответственно в пределах

 
nLeft
n
nRight
mBottom
m
mTop
≤
≤
≤
≤
,
.

Удобно эти соотношения оформить в виде двух inline-функций 
xn() и ym(). Inline-функция — это такая функция, чье тело подставляется в каждую точ ку вызова вместо того, чтобы генерировать код 
вызова. Использование inline-функций — это важная особенность 
языка С++, которую нельзя найти в языке языке С.
Причина использования inline-функции заключается в ее эффективности. Всякий раз, когда вы зывается функция, необходимо выполнить серию инструкций для формирования вызова функции, 
вставки аргументов в стек и возврата значения из функции. В некоторых случаях для этого прихо дится использовать много тактов центрального процессора. При использовании inline-функции нет необходимости в таких дополнительных действиях, и скорость выполнения программы возрастает. Приведем соответствующий фрагмент 
кода.

//переход от x к пикселю n
inline int xn(double x)
{
 return (int)((x — xLeft)/(xRight — xLeft)*(nRight — 
— nLeft)) + nLeft;
}

//переход от y к пикселю m
inline int ym(double y)
{
 return (int)((y — yBottom)/(yTop — yBottom)*(mTop — 
— mBottom)) + mBottom;
}

1.2. графичеСкие библиоТеки

Графические средства в языке C++ и в его предшественнике C 
полностью отсутствуют. Все возможности для работы с графикой 
компиляторы C++ представляют в виде дополнительных библиотек 
графических функций.

Раньше программы работали под MS-DOS, и в качестве инструмента для работы с графикой использовались графические библиотеки под MS-DOS компилятора BC++ 3.1 фирмы Borland.
При работе программы под Windows компилятор использует 
функции графического интерфейса GDI (Graphic Device Interface — 
интерфейс графических устройств), которые предоставляет ему 
система Windows. Исторически сложилось, что существуют графические функции для двух платформ Win16 и Win32.
Для создания программ на платформе Win16 можно использовать 
компилятор BC++ 3.1, если его настроить соответствующим образом, или компилятор BC++ 5.0.
Для создания программ на платформе Win32 можно использовать 
компилятор BC++ 5.0 или интегрированные среды Visual C++ 6.0, 
Visual Studio 2005, Visual Studio 2008, Visual Studio 2010, Visual Studio 
2012, а также графические функции специализированных графических библиотек, таких как OpenGL. 

1.3. Программирование графики в WIndoWs

Программирование графики в Windows имеет свои особенности.
Во-первых, в составе Windows имеются графические функции, 
которые любая программа может использовать для создания изображений. Поэтому компиляторы, создающие программы под Windows, 
обычно не имеют собственных графических библиотек, а используют 
функции, которые им предоставляет данная система.
Операционная система Windows имеет набор библиотечных 
функций для разработки приложений. Эти функции обеспечивают 
широкую поддержку программирования приложений Windows 
и в совокупности называются интерфейсом API (Application Program 
Interface — интерфейс прикладного программирова ния). Графические функции из состава API Windows объединены в отдельную 
группу — подсистему GDI (Graphic Device Interface — интерфейс 
графических устройств). В литературе эти функции называют графическими функциями API Windows или функциями GDI Windows.
Во-вторых, работающая программа взаимодействует с операционной системой Windows с помощью механизма передачи сообщений. 
Все свои действия программа производит в ответ на последовательность сообщений, и пока программа работает, Windows посылает ей 
сообщения. Сообщение возникает, если что-то происходит в системе, 
например нажатие клавиши, движение мыши и т.д. Эти сообщения 
помещаются в очередь, которая может хранить несколько сообщений. 
Программа обращается к очереди и извлекает первое из сообщений, 

затем программа или обрабатывает это сообщение, или переходит 
к следующему. Рассмотрим некоторые из этих сообщений:
1) сообщение WM_PAINT отправляется, если существует необходимость нарисовать или перерисовать окно программы;
2) сообщение WM_COMMAND отправляется, если пользователь выбирает команду меню;
3) сообщение WM_DESTROY отправляется перед тем, как окно 
уничтожается и программа прекращает работу.
В-третьих, программа работает в оконном режиме: при запуске 
программы создается окно, в котором выводятся результаты работы 
программы.

1.4. ПроСТая Программа риСования СинуСоиды

Программа Program_01 состоит из главной функции WinMain(), 
функции главного окна WndProc(), куда приходят сообщения, 
и функции Line_Paint() рисования синусоиды. Кроме того, имеются две вспомогательные функции xn() и ym() для перевода мировых координат в экранные координаты (пиксели).
В начале файла Program_01.cpp указаны подключаемые библиотеки.

#include <windows.h> 
#include <math.h>
#include <tchar.h>

Затем показаны прототипы функций.

//прототипы функции
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Line_Paint(HWND);
inline int ym(double);
inline int xn(double);

После этого дается описание главной функции WinMain().

TCHAR cname[] = _T("Class"); //имя класса окна
TCHAR title[] = _T("Sinusoid"); //заголовок окна

//главная функция
int WINAPI WinMain(HINSTANCE hInstance, 
     HINSTANCE hPrevInstance,

К покупке доступен более свежий выпуск Перейти