КГ_7глава (1024119), страница 2
Текст из файла (страница 2)
Результат работы программы studExi3 изображен на рис. 7.8.
Рис. 7.8. Пирамида и три зеркала
В этом примере объекты являются либо только зеркальными, либо только диффузными. Кроме того, не показывается сам источник света — предполагается, что он не виден ни прямо, ни в отраженном виде. Источник света здесь один — точечный, светит равномерно во все стороны белым светом.
Поскольку объектов немного и они просты, то здесь не используется метод оболочек.
Данную программу можно усовершенствовать для показа более сложных) изображений. Например, предусмотреть несколько разноцветных источников'
света, зеркальные блики, прозрачность объектов. Сделайте это самостоятельно в качестве упражнения.
7.2. Линии
В состав API Windows входит несколько функций, которые рисуют прямые и кривые линии:
D AngleArc — дуга окружности с заданием углов; D Arc, ArcTo — дуга эллипса;
□ LineDDA — вычисление координат пикселов отрезка прямой линии и вызов определяемой пользователем функции вывода пикселов;
□ LineTo — рисование отрезка прямой линии от текущей позиции к заданной точке;
□ MoveToEx — задание текущей позиции графического вывода;
□ PoIyBezier, PoIyBezierTo — один или несколько связанных между собой кубических сплайнов Безье;
□ PoIyDraw — несколько связанных отрезков прямых и сплайнов Безье;
□ Polyline, PolylineTo — ломаная линия из многих связанных между собой отрезков прямых (полилиния);
□ PolyPoIyline — несколько полилиний как единый объект.
Примеры для линий— графических примитивов API Windows— даны в табл. 7.1.
Таблица 7.1
Стиль линии. Перо
В терминологии Windows API перо описывает следующие характеристики линии — цвет, толщину и стиль (пунктир). Перо — один из атрибутов контекста графического устройства. По умолчанию в контекст выбрано перо, которое соответствует черной тонкой непрерывной линии. Такое перо относится к стандартным перьям.
Все линии, рисуемые вашей программой с помощью функций GDI Windows API, выводятся одним и тем же цветом, имеют одинаковую толщину и тот же стиль до тех пор, пока не изменить перо. Функции рисования линий не имеют аргументов для указания текущих атрибутов линий (это характерно для графических библиотек, в которых подобные характеристики рисуемых объектов записываются как глобальные переменные, чтобы уменьшить количество аргументов вызова функций рисования). Перо относится ко всем линиям и контурам фигур.
Чтобы начать рисовать линии, например, другим цветом, необходимо создать новое перо и выбрать его в контексте графического устройства. Отныне все
f линии будут рисоваться данным пером до тех пор, пока вы не выберете в ! контексте устройства очередное перо.
! Важно то, что, создавая новое перо, нужно обязательно позаботиться об [ уничтожении предыдущего пера. Перо есть объект GDI, для него выделяется специальная область памяти. Перо существует до тех пор, пока его не унич-; тожить. Завершение работы прикладной программы может и не привести к автоматическому уничтожению объектов GDI и освобождению памяти компьютера. Своевременное уничтожение неиспользуемых объектов GDI возлагается на вашу программу. Иначе для некоторых версий Windows могут возникнуть утечки памяти, накопление которых может привести к нежелательным последствиям.
Не следует пытаться уничтожить стандартные перья.
Для определения стиля линий используются функции, которые имеют в своем названии —Реп—. Типичная последовательность для вывода линии с заданным стилем может быть такой:
Здесь создается перо, которое соответствует тонкой красной штрих-пунктирной линии. После использования перо уничтожается.
Меридианы и параллели
РаССМОТрИМ Пример Программы, В КОТОРОЙ ИСПОЛЬЗуЮТСЯ фуНКЦИИ MoveToEx
и Ыпето для рисования меридианов и параллелей шара. Текст программы studex2о. срр:
Изображение шара приведено на рис. 7.9. Запустите программу, выберите пункт меню "Графика" и вы увидите шар, который, как кажется, вращается вокруг оси. Здесь вращается не шар, а система координат. Для этого использовано соответствующее преобразование координат при создании проек* ции — повороты координат. Углы наклона камеры в этом примере следующие: а=0... 180, β=45 градусов. ^г^ппетш^ Меридианы и параллели рисуются только для тех точек поверхности, для которых координата Z больше нуля (в повернутой системе). Положительные значения Z соответствуют видимой части шара. Рисование меридианов и параллелей сделано в виде одной функции MeridOrParal для уменьшения размера текста программы. Необходимо отметить, что эта программа разработана как раз для шара. Чтобы
нарисовать подобным образом, например, эллипсоид, необходимо сделать существенные изменения в тексте программы.
Фрактал из линий
В следующем примере программы мы используем линии для рисования фрактала. Этот фрактал немного напоминает папоротник (рис. 7.10). Используем перья различных оттенков зеленого цвета для имитации ствола, ветвей и листвы.
В этом примере рисуются линии различной толщины: для листвы линии толстые, а для ствола и ветвей — тонкие (можно и наоборот — для листвы более толстые линии).
Рис. 7.10. Фрактал из линий Текст программы studex2i. срр:
7.3. Фигуры
В API Windows есть несколько графических примитивов, которые предназначены для рисования фигур с заполнением:
□ Chord — хорда эллипса;
□ Ellipse — эллипс;
□ Pie — сектор эллипса;
□ Polygon — полигон;
□ PolyPolygon — несколько полигонов и (или) полигоны с пустотами;
□ Rectangle — прямоугольник;
□ RoundRect — прямоугольник со скругленными углами.
Таблица 7.2
Стиль заполнения.Кисть
По умолчанию в контексте графического устройства устанавливается стиль заполнения сплошным белым цветом. Для того чтобы рисовать определенную фигуру другим стилем, необходимо создать соответствующую кисть. Кисть и стиль заполнения — синонимы в API Windows.
Кисть — это объект GDI. Он требует памяти. Кроме того, все кисти, созданные во время работы программы, необходимо уничтожить, иначе они могут остаться в памяти после завершения программы. Общая схема использования кистей такая же, как и для перьев:
1. Создание кисти, выбор ее в контекст.
2. Рисование фигур с заполнением.
3. Освобождение контекста, уничтожение кисти.
Сплошная кисть создается функцией CreateSoiidBrush. Рассмотрим пример использования оранжевой кисти.
Штриховая кисть создается функцией CreateHatchBrash. CreateHatchBrush(HS_DIAGCROSS, RGB(0,0,255));
КИСТЬ С заданием растрового шаблона — CreatePatternBrush.
Рисование поверхности 1
Рассмотрим пример программы для рисования поверхности, заданной в виде! функции z =f(х, у), например: 1
Для рисования с удалением невидимых точек поверхности используем метод ] сортировки граней по глубине, а точнее, будем прямо рисовать грани от самых дальних к самым близким. Каждую грань можно рисовать четырехугольником-полигоном (рис. 7.11.).
Рис. 7.11. Поверхность z = f{x, у)
7.4. Шрифт TrueType
Рассмотрим пример использования шрифтов TrueType (рис. 7.12).
Рис. 7.12. Использование шрифта TrueType Текст программы studex2 з. срр:
В некоторых версиях Windows, возможно, эта программа не будет корректно работать. Может потребоваться задать другое имя шрифта. Но для того, чтобы буквы показывались с наклоном, этот шрифт обязательно должен быть типа TrueType (подойдет и ОрепТуре для Win2000).