Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KG / КГ_8глава.doc
Скачиваний:
99
Добавлен:
26.05.2014
Размер:
586.75 Кб
Скачать

Глава 8

Примеры использования классов языка C++

Рассмотрим пример графической программы, создающей изображения объ­ектов на основе нескольких простых элементов (рис. 8.1).

!

Рис. 8.1. Трехмерные объекты в различных ракурсах показа

Используем объектно-ориентированную методологию. Каждый элемент бу­дем считать объектом трехмерного пространства, а несколько таких объектов образовывают модель сложного объекта. Для описания объектов используем классы C++. Процитируем автора языка C++ Б. Страустрапа: "Определите, какие классы вам нужны; предусмотрите полный набор операций для каждо-

[ го класса; опишите общие черты явным образом, используя наследова-

! ние" [24].

Сложный пространственный объект в нашей программе построим с исполь­зованием таких элементов: куб, сфера и пирамида. Фундамент и колонны бу-

дем считать производными элементами, их определим как множество кубов, специальным образом располагающихся в пространстве (рис. 8.2).

Рис. 8.2. Иерархия классов

В качестве базового элемента определим абстрактный класс фигуры с такими свойствами: размер, цвет, расположение в пространстве, описываемое коор­динатами ее центра. Также предусмотрим для фигур возможность перемеще­ния, изменения размера, цвета и возможность быть нарисованной. Такие об­щие свойства выразим в классе shape. В этом классе также предусмотрим операцию преобразования координат для отображения в определенной про­екции (функция-член PrepareVertex).

Теперь обсудим способ отображения объектов. Поскольку у нас есть элемен­ты-многогранники (куб и пирамида), то можно было бы использовать доста­точно быстродействующую функцию Polygon API Windows для рисования граней. А удаление невидимых точек осуществлять сортировкой граней по глубине. Однако такой способ отображения в нашем случае не приемлем, Чуть позже мы покажем почему, а пока что обсудим довольно интересные нюансы объектно-ориентированного стиля программирования. Если бы у нас все объекты были многогранниками, то сортировка граней по глубине озна­чала бы определенную последовательность рисования граней. Например,) сначала одну грань одного объекта, потом соответствующую грань другого \ объекта и так далее. Последовательность рисования в этом случае должна быть от самых дальних граней к самым близким. Однако это усложняет объ­ектно-ориентированную реализацию программы, поскольку желательно было бы, чтобы объект был самодостаточным с точки зрения каждой операции, | выполняемой над ним, — а это невозможно, так как операция сортировки граней должна обеспечивать доступ к отдельным граням, а не только к объ­екту в целом. Хотя объектно-ориентированная методология не накладывает столь жестких ограничений на реализацию объектов, однако, такое наруше­ние самодостаточности (инкапсуляции) выглядит не очень эстетично.

Поскольку среди элементов кроме многогранников есть сфера, то метод сор- j тировки граней по глубине нельзя использовать, так как сфера — это не мно- j

гогранник, и она рисуется по пикселам (хотя можно было бы определить ее как многогранник, закрашенный, например, по методу Гуро, однако это на­много сложнее, и в данном примере программы не рассматривается). Необ­ходимо использовать Z-буфер, а функция Polygon его не поддерживает. Более того, в составе функций API Windows нет ни одной функции рисования, рас­считанной на использование Z-буфера. Такие функции мы вынуждены скон­струировать сами. Относительно объектной ориентированности— метод Z-буфера позволяет полностью инкапсулировать операцию рисования объ­екта в виде одной функции-члена (мы ее назовем :: Draw). Один вызов функ­ции Draw обеспечивает полный цикл отображения объекта соответствующего класса.

Текст программы (studex34. срр):

!

Скомпилируйте и запустите программу studex34. Необходимо предупредить, что цикл показа может затянуться надолго. В программе выполняется пол­ный оборот камеры на 360 градусов с шагом в один градус. Время создания и отображение всех 361 кадров в соответствующих ракурсах на компьютере с процессором AMD K6-2, 300 МГц, в 24-битном видеорежиме составляло 807 секунд. То есть, на один кадр расходуется в среднем 807/361 = 2.24 се­кунды. Размеры окна не изменялись после запуска программы, это отвечает размерам изображения 392 на 239 пикселов. Необходимо признать, что эта программа демонстрирует черепашью скорость рендеринга.

Соседние файлы в папке KG