Программирование графики на С++. Теория и примеры
Покупка
Основная коллекция
Тематика:
Программирование на C и C++
Издательство:
НИЦ ИНФРА-М
Год издания: 2023
Кол-во страниц: 517
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-16-017914-8
ISBN-онлайн: 978-5-16-106928-8
Артикул: 637286.10.01
К покупке доступен более свежий выпуск
Перейти
В учебном пособии рассматриваются основные методы и алгоритмы построения графических изображений. Подробно анализируются приемы моделирования движения (анимации) двумерных изображений, рассматриваются алгоритмы трехмерной графики, построение сплайнов и сплайновых поверхностей, основы работы в графической библиотеке OpenGL. Каждое теоретическое положение компьютерной графики исследуется на примерах программ, написанных на С++. Особое внимание уделено взаимодействию программ с операционной системой Windows. Все примеры апробированы в среде разработки проектов Visual Studio 2008.
Соответствует требованиям федеральных государственных образовательных стандартов высшего образования последнего поколения.
Для студентов, обучающихся по направлению подготовки 09.04.04 «Программная инженерия», и всех интересующихся программированием графики.
Тематика:
ББК:
УДК:
ОКСО:
- Среднее профессиональное образование
- 15.02.16: Технология машиностроения
- ВО - Бакалавриат
- 01.03.02: Прикладная математика и информатика
- 01.03.04: Прикладная математика
- 02.03.02: Фундаментальная информатика и информационные технологии
- 02.03.03: Механика и математическое моделирование
- 03.03.02: Прикладная математика и информатика
- 04.03.02: Химия, физика и механика материалов
- 09.03.04: Программная инженерия
- ВО - Магистратура
- 09.04.04: Программная инженерия
ГРНТИ:
Только для владельцев печатной версии книги: чтобы получить доступ к дополнительным материалам, пожалуйста, введите последнее слово на странице №267 Вашего печатного экземпляра.
Ввести кодовое слово
ошибка
-
Рисунки.pdf
Скопировать запись
Программирование графики на С++. Теория и примеры, 2024, 637286.12.01
Программирование графики на С++. Теория и примеры, 2021, 637286.07.01
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
ПРОГРАММИРОВАНИЕ ГРАФИКИ НА С++ ТЕОРИЯ И ПРИМЕРЫ В.И. КОРНЕЕВ Л.Г. ГАГАРИНА М.В. КОРНЕЕВА Москва ИНФРА-М 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,
К покупке доступен более свежий выпуск
Перейти