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

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

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

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

Корнеев, В. И. Программирование графики на С++. Теория и примеры : учебное пособие / В.И. Корнеев, Л.Г. Гагарина, М.В. Корнеева. — Москва : ИНФРА-М, 2023. — 517 с. + Доп. материалы [Электронный ресурс]. — (Высшее образование: Бакалавриат). — DOI 10.12737/23113. - ISBN 978-5-16-017914-8. - Текст : электронный. - URL: https://znanium.com/catalog/product/1894585 (дата обращения: 30.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
ПРОГРАММИРОВАНИЕ 
ГРАФИКИ НА С++

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

В.И. КОРНЕЕВ
Л.Г. ГАГАРИНА
М.В. КОРНЕЕВА

Москва
ИНФРА-М
2023

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

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

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

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

ISBN 978-5-16-017914-8 (print)
ISBN 978-5-16-106928-8 (online)
В учебном пособии рассматриваются основные методы и алгоритмы построения 
графических изображений. Подробно анализируются приемы моделирования 
движения (анимации) двумерных изображений, рассматриваются 
алгоритмы трехмерной графики, построение сплайнов и сплайновых поверхно-
стей, основы работы в графической библиотеке OpenGL. Каждое теоретическое 
положение компьютерной графики исследуется на примерах программ, напи-
санных на С++. Особое внимание уделено взаимодействию программ с опера-
ционной системой Windows. Все примеры апробированы в среде разработки 
проектов Visual Studio 2008.
Соответствует требованиям федеральных государственных образователь-
ных стандартов высшего образования последнего поколения.
Для студентов, обучающихся по направлению подготовки 09.04.04 «Про-
граммная инженерия», и всех интересующихся программированием графики.

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

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

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

ISBN 978-5-16-017914-8 (print)
ISBN 978-5-16-106928-8 (online)

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

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

Предисловие

Настоящая книга является введением в программирование ком-
пьютерной графики и предназначается в первую очередь для сту-
дентов, специализирующихся в программировании. Материал изла-
гается с точки зрения программиста, и все методы и алгоритмы ком-
пьютерной графики представлены таким образом, чтобы можно 
было легко написать соответствующий код программы. Для лучшего 
восприятия этого курса желательно уметь, хотя бы немного, про-
граммировать на алгоритмическом языке программирования 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,

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