Учебник Фамилия, имя, отчество




НазваниеУчебник Фамилия, имя, отчество
страница7/12
Дата18.04.2013
Размер1.59 Mb.
ТипУчебник
1   2   3   4   5   6   7   8   9   ...   12

3.2. Использование графических функций API Windows

Операционная система Windows предоставляет программистам возможность использовать в своих программах сотни разнообразных функций, доступ к которым сделан в виде интерфейса API (Application Program Interface – прикладной программный интерфейс). При разработке программы на основе компьютерных языков, таких как С, C++, Pascal, в текст программы можно включать вызовы функций, которые входят в состав API Windows. После компиляции создается выполняемый файл (.ехе), который можно запускать на разных компьютерах с различными вер­сиями ОС Windows, и программа будет корректно выполняться. Поскольку сами функции располагаются в модулях операционной системы, а в программе содержатся только вызовы функций (call), то код выполняемого файла имеет небольшой размер.


3.2.1. Контекст графического устройства

Графические функции из состава API Windows объединены в отдельную группу – подсистему GDI (Graphic Device Interface – интерфейс графического устройства). Важная черта подсис­темы GDI – аппаратная независимость многих функций от конкретного гра­фического устройства.

Контекст графического устройства (Device Context) – фундаментальное понятие графики для функций API Windows. Понятие контекста введено для описания того, где будет рисоваться изображение. Другими словами, контекст графического устройства указывает плоскость отображения, на ко­торую делается графический вывод. В качестве контекста может быть окно программы на экране дисплея или страница принтера, или другое место, куда можно направить графический вывод.

Если программа делает вызов графических функций API Windows, та­ких как рисование точек, линий, фигур, текста и тому подобных, необходимо указывать идентификатор контекста (handle of device context) и координаты. Вызов необходимого драйвера – для экрана дисплея, принтера или другого устройства – делает уже сама Windows. Это в значительной мере освобож­дает программиста от второстепенных дел и облегчает разработку программ, однако желательно учитывать специфику работы конкретного устройства.

Идентификатор контекста графического устройства (hdc) – это числовое значение, знание которого дает возможность направить графический вывод в нужное место. Перед началом рисования необходимо получить это числовое значение. После рисования обычно нужно освободить, деактивизировать контекст. Несоблюдение этого требования чревато неприятными последст­виями – от утечек памяти до прекращения нормальной работы программы. Корректное использование контекста графического устройства осуществля­ется в такой последовательности:

1. Создание, активизация контекста, получение значения hdc.

2. Рисование с помощью графических функций API Windows.

3. Уничтожение, деактивизация контекста соответствующего hdc.

Для рисования в окне программы на экране дисплея можно использовать пару функций GetDC и ReleaseDC (все последующие примеры приведены на языке Паскаль):

Var hdc: HDC;

hdc := GetDC(hWnd);

... //здесь вызовы функций рисования

ReleaseDC(hWnd,hdc);

Функция GetDC получает идентификатор контекста hdc для окна, заданного кодом hWnd. Например, для главного окна программы. Использование контекста графического вывода завершается вызовом функции ReleaseDC.

Для принтера значение hdc получить несколько сложнее. Сначала необходи­мо узнать имя принтера – это делается с помощью функции EnumPrinters. Потом создается контекст вывода с помощью функции CreateDC. Печать на принтере выполняется с помощью функций StartDoc, StartPage, EndPage и EndDoc. После вызова функции EndDoc контекст принтера необходимо осво­бодить с помощью функции DeleteDC.


3.2.2. Графические примитивы API Windows


Отдельные пикселы

Функция SetPixel рисует один пиксел растра. Она имеет такие аргументы:

SetPixel(hdc, х, у, clr),

где hdc— контекст, х,у – координаты, сlr – цвет пиксела. Аргумент clr имеет тип 4-байтного COLORREF, причем три младших байта соответствуют компонентам Blue, Green, Red (в диапазоне от 0 до 255 каждая), а старший байт не используется. Функция SetPixel сама имеет тип COLORREF – она возвращает значение цвета пиксела.

Кроме SetPixel в API Win32 есть функция SetPixelV, работающая немного быстрее, поскольку не возвращает значения; а также предусмотрена функция для получения цвета любого пиксела растра – GetPixel.

С помощью таких функций, которые оперируют отдельными пикселами, возможно создать любое растровое изображение.

Линии

В состав API Windows входит несколько функций, которые рисуют прямые и кривые линии (табл. 3.1):

· AngleArc – дуга окружности с заданием углов;

· Arc, ArcTo – дуга эллипса;

· LineDDA – вычисление координат пикселов отрезка прямой линии и вы­зов определяемой пользователем функции вывода пикселов;

· LineTo – рисование отрезка прямой линии от текущей позиции к задан­ной точке;

· MoveToEx – задание текущей позиции графического вывода;

· PolyBezier, PolyBezierTo – один или несколько связанных между собой кубических сплайнов Безье;

· PolyDraw – несколько связанных отрезков прямых и сплайнов Безье;

· Polyline, PolylineTo – ломаная линия из многих связанных между собой отрезков прямых (полилиния);

· PolyPolyline – несколько полилиний как единый объект.

Таблица 3.1.

Примеры построения линий



Фигуры

В API Windows есть несколько графических примитивов, которые предна­значены для рисования фигур с заполнением (табл. 3.2):

· Chord – хорда эллипса;

· Ellipse – эллипс;

· Pie – сектор эллипса;

· Polygon —полигон;

· PolyPolygon – несколько полигонов и (или) полигоны с пустотами;

· Rectangle – прямоугольник;

· RoundRect – прямоугольник со скругленными углами.

Таблица 3.2.

Примеры построения фигур




3.2.3. Стиль линии. Перо

В терминологии Windows API перо описывает следующие характеристики линии – цвет, толщину и стиль (пунктир). Перо – один из атрибутов кон­текста графического устройства. По умолчанию в контекст выбрано перо, которое соответствует черной тонкой непрерывной линии. Такое перо отно­сится к стандартным перьям.

Все линии, рисуемые программой с помощью функций GDI Windows API, выводятся одним и тем же цветом, имеют одинаковую толщину и тот же стиль до тех пор, пока не изменить перо. Функции рисования линий не име­ют аргументов для указания текущих атрибутов линий (это характерно для графических библиотек, в которых подобные характеристики рисуемых объ­ектов записываются как глобальные переменные, чтобы уменьшить количе­ство аргументов вызова функций рисования).

Перо относится ко всем линиям и контурам фигур.

Чтобы начать рисовать линии, например, другим цветом, необходимо создать новое перо и выбрать его в контексте графического устройства. Отныне все линии будут рисоваться данным пером до тех пор, пока вы не выберете в контексте устройства очередное перо.

Создавая новое перо, нужно обязательно позаботиться об уничтожении предыдущего пера. Перо есть объект GDI, для него выделяется специальная область памяти. Перо существует до тех пор, пока его не унич­тожить. Завершение работы прикладной программы может и не привести к автоматическому уничтожению объектов GDI и освобождению памяти ком­пьютера. Своевременное уничтожение неиспользуемых объектов GDI возла­гается на программу. Иначе для некоторых версий Windows могут воз­никнуть утечки памяти, накопление которых может привести к нежелатель­ным последствиям. Не следует пытаться уничтожить стандартные перья.

Для определения стиля линий используются функции, которые имеют в сво­ем названии …Pen…. Типичная последовательность для вывода линии с за­данным стилем может быть такой:


var hpen: HPEN;

//создается перо, которое соответствует тонкой красной штрих-пунктирной линии

hPen := CreatePen(PS_DASHDOT, 1, RGB(255,0,0) );

... // здесь рисуем линии

DeleteObject(hPen); //уничтожаем наше перо


3.2.4. Стиль заполнения. Кисть

По умолчанию в контексте графического устройства устанавливается стиль заполнения сплошным белым цветом. Для того чтобы рисовать определен­ную фигуру другим стилем, необходимо создать соответствующую кисть. Кисть и стиль заполнения – синонимы в API Windows.

Кисть – это объект GDI. Он требует памяти. Кроме того, все кисти, создан­ные во время работы программы, необходимо уничтожить, иначе они могут остаться в памяти после завершения программы. Общая схема использования кистей такая же, как и для перьев:

1. Создание кисти, выбор ее в контекст.

2. Рисование фигур с заполнением.

3. Освобождение контекста, уничтожение кисти.

Сплошная кисть создается функцией CreateSolidBrush. Рассмотрим пример использования оранжевой кисти:

var hBrush: HBRUSH;

hBrush := CreateSolidBrush(RGB(255,128,0) );

... //здесь рисуем фигуры

DeleteObject(hBrush);

Штриховая кисть создается функцией CreateHatchBrash:

CreateHatchBrush(HS_DIAGCROSS, RGB(0,0,255)) ;


3.3. Принципы построения “открытых” графических систем

OpenGL – не отдельная программа, а часть операционной системы. Это означает, что откомпилированное приложение, использующее OpenGL, не нуждается ни в каких дополнительных программах и модулях, кроме стан­дартных, содержащихся на любом компьютере с установленной операцион­ной системой Windows 95 версии OSR2 и выше.

Библиотека OpenGL физически размещена в виде двух DLL-файлов: opengl32.dll и glu32.dll. Первый из этих файлов и есть собственно библиотека OpenGL. Назначение его – осуществление взаимодействия с акселератором или программная эмуляция ускорителя за счет центрального процессора. Поддержка 3D-акселерации осуществляется с помощью полного (устанавли­ваемого) клиентского драйвера (Installable Client Driver, ICD) и мини-драйвера (Mini-Client Driver, MCD).

Библиотека OpenGL реализована по клиент-серверной схеме, т. е. приложение выступа­ет в роли клиента – оно вырабатывает команды, а сервер OpenGL интерпретирует и выполняет их. Библиотеку OpenGL одно­временно может использовать несколько приложений при единственной копии сервера в памяти или вообще при удаленном расположении сервера (сервер в принципе может располагаться и не на компьютере клиента).

OpenGL хорошо структурирована. Ее драйверы включают информацию об основном оборудовании, освобождая разра­ботчика приложения от необходимости проектирования для специфиче­ских особенностей графических устройств. Команды OpenGL обеспечи­вают необходимый баланс между необходимыми функциональными возможностями и гибкостью. Каждая команда OpenGL строго придержи­вается опубликованной спецификации.

Поскольку OpenGL применяется только для воспроизведе­ния, то она может включаться в состав любой, не только графической (Windows 95/98, Windows NT), операционной системы. Более того, OpenGL спроектирована таким образом, чтобы использовать все преимущества любых, даже самых изощренных графических подсистем.

OpenGL является программным интерфейсом для графических устройств и включает в себя свыше ста функций и процедур, которые позволяют про­граммисту определять объекты и сложные операции для создания высокока­чественных образов. С точки зрения программиста OpenGL представляет собой множество команд, одни из которых позволяют определять двумер­ные и трехмерные графические объекты, а другие управляют их отображе­нием в буфере кадра. В этом состоит основное и единственное предназна­чение OpenGL. Она не поддерживает никакое другое периферийное устрой­ство (например, мышь или клавиатуру), которое может быть связано с графическим устройством. Поэтому программист должен сам обеспечить возможность принимать данные от пользователя, используя для этого другие механизмы.

Перечислим основные возможности, которые OpenGL предоставляет разра­ботчикам:

· Геометрические примитивы (точки, линии и многоугольники).

· Растровые примитивы (битовые массивы и прямоугольники пикселей).

· Работа с цветом в RGB и индексном режимах.

· Видовые и модельные преобразования.

· Удаление невидимых линий и поверхностей.

· Прозрачность.

· Использование сплайнов для рисования линий и поверхностей.

· Наложение текстуры.

· Применение освещения.

· Использование плавного сопряжения цветов, “тумана” и других “атмосферных” эффектов, устранения ступенчатости.

· Использование списков изображений.

Таблица 3.3.

Типы данных OpenGL



Все команды (процедуры и функции) OpenGL начинаются с префикса gl, а все константы – с префикса GL_. Кроме того, в имена функций и процедур OpenGL вхо­дят суффиксы, несущие информацию о числе передаваемых параметров и их типе. В таблице 3.3 приводятся вводимые OpenGL типы данных и суффиксы, которые им соответствуют.

OpenGL можно рассматривать как машину, находящуюся в одном из нескольких состояний. Внутри OpenGL содержится целый ряд переменных, например текущий цвет. Если установить текущий цвет, то все последующие объекты будут этого цвета до тех пор, пока текущий цвет не будет изменен. По умолчанию каждая системная переменная имеет свое значение и в любой момент значение каждой из этих пере­менных можно узнать. Для опреде­ления значения некоторых переменных служат специальные функции.

OpenGL предоставляет пользователю достаточно мощный, но низкоуровневый набор команд. В частности это означает, что рисование объемных фигур сводится к последовательному рисованию в пространстве плоских фигур, образующих нужную объемную. Для облегчения работы вместе с OpenGL поставляется библиотека дополнитель­ных команд, каждая из которых начинается с префикса glu.


3.4. Двумерные построения в OpenGL

Данный материал не ставит целью научить программированию графики с использованием OpenGL, а лишь дает некоторое представление об использовании графической библиотеки на примере среды программирования Delphi.

Точка

В OpenGL левый нижний угол области вывода имеет координаты [-1; -1], правый верхний – [1, 1].

Рассмотрим самый простой из примитивов OpenGL – точку. В среде Delphi нарисуем на экране пять точек, четыре по углам окна и одну в центре.

glPointSize (20); // размер точек

glColor3f (1.0, 1.0, 1.0); // цвет примитивов

glBegin (GL_POINTS); // открываем командную скобку

glVertex2f (-1, -1); // левый нижний угол

glVertex2f (-1, 1); // левый верхний угол

glVertex2f (0, 0); // центр окна

glVertex2f (1, -1); // правый нижний угол

glVertex2f (1, 1); // правый верхний угол

glEnd; // закрываем командную скобку


Результат работы программы приведен на рис. 3.1.



Рис. 3.1. Точки

Первые две строки программы определяют параметры выводимых точек: размер и цвет. Далее в программе следуют функции (командные скобки) glBegin и glEnd, между которыми заключены собственно процедуры рисования. Большинство графических построений связано с использованием именно этой пары функций. Это командные скобки библиотеки OpenGL, не заменяющие операторные скобки языка Pascal и не имеющие к ним никакого отношения. Внутри этих скобок могут находиться любые операторы языка Pascal и почти любые функции OpenGL (вернее, очень многие). Включен­ные в скобки команды OpenGL отрабатываются так же, как и за пределами этих скобок. Главное назначение командных скобок – это задание режима (примитива) для команд glVertex (вершина), определяющих координаты вершин для рисования примитивов OpenGL.

В рассмотренном примере аргументом функции glBegin является символиче­ская константа GL_POINTS. В этом случае все встретившиеся до закрывающей скобки glEnd вершины (аргументы glVertex) задают координаты очередной отдельной точки.

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

В данном примере точки рисуются в виде квадратиков. Что­бы получить точки в виде кружочков, перед glBegin нужно вставить строку:

glEnable (GL_POINT_SMOOTH); // включаем режим сглаживания точек

Команды glEnable и glDisable соответственно включают и отключают режимы работы следующих за ними команд.

Приведем один простой пример на рисование точек. Следующий код нарисует сотню точек со случайными координатами и цветами и размерами:

For i:=1 to 100 do begin

glColor3f (random, random, random);

glPointSize (random (20));

glBegin (GL_POINTS);

glVertex2f (random*2-1, random*2-1);

glEnd;

end;

Отрезок

Примитив “независимый отрезок” задается аргументом команды glBegin – константой GL_LINES.

Для этого примитива следующие в командных скобках вершины (т. е. функ­ции glVertex) задают попарно координаты начала и конца каждого отрезка прямой.

Нарисуем два отрезка, соединяющие углы окна по диагоналям:

glBegin (GL_LINES);

glVertex2f (-1, 1);

glVertex2f (1, -1);

glVertex2f (-1, -1);

glVertex2f (1, 1);

glEnd;

Для увеличения толщины отрезков перед командными скобками можно указать ширину линии:

glLineWidth (2.5);

Эта функция также должна выноситься за командные скобки.

Как и у точек, у линий можно устранять ступенчатость командой:

glEnable (GL_LINE_SMOOTH).

Константа GL_LINE_STRIP определяет примитив, когда пере­числяемые вершины последовательно соединяются одна за другой. Приво­димый код поясняет отличие этого примитива от предыдущего:

glBegin (GL_LINE_STRIP) ;

glVertex2f (-1, -1);

glVertex2f (-1, 1);

glVertex2f (1, 1);

glVertex2f (1, -1);

glEnd;

Результат – буква П по границе окна.

В примитиве, задаваемом константой GL_LINE_LOOP, также последовательно соединяются перечисляемые вершины, однако последняя вершина замыка­ется с самой первой. Если в предыдущем примере использовать GL_LINE_LOOP, будет построен квадрат по границе окна.

В примерах на отрезки мы пока использовали непрерывную линию. Для рисования пунктирной линией перед командными скобками нужно добавить сле­дующие строки:

glLineStipple (1, $F0F0);

glEnable (GL_LINE_STIPPLE) ;

У функции glLineStipple первый аргумент – масштабный множитель, вто­рой аргумент задает шаблон штриховки (побитовым способом).

Треугольник

Треугольник задается примитивом GL_TRIANGLES. В этом примитиве последующие вершины берутся тройками, по которым строится каждый отдельный треуголь­ник.

Следующий код служит иллюстрацией рисования одного треугольника:

glBegin (GL_TRIANGLES);

glVertex2f (-1, -1);

glVertex2f (-1, 1);

glVertex2f (1, 0);

glEnd;

Результат работы программы приведен на рис. 3.2.



Рис. 3.2 Треугольник

Константа GL_TRIANGLE_STRIP задает связанную группу треугольников. Первые три вершины образуют первый треугольник, вершины со второй по четвертую – второй треугольник, с третьей по пя­тую – третий и т. д.

Примитив, определяемый константой GL_TRIANGLE_FAN, также задает последовательно связанные треугольники, однако фигура строится по другому принципу: первая вершина является общей для всех остальных треугольников, задаваемых перечислением вершин, т. е. треугольники свя­зываются наподобие веера.

Теперь поговорим о режимах вывода многоугольников. Для устранения ступенчатости многоугольников используется команда glEnable с аргументом GL_POLYGON_SMOOTH.

Команда glPolygonMode позволяет выводить вместо заполненных и контур­ных многоугольников только их вершины, если ее вторым аргументом взять константу GL_POINT. Если в примеры на треугольники перед командными скобками поместить строку. Если использовать константу GL_LINE, то треугольники будут рисоваться контурно – только линии границ. По умолчанию многоугольники строятся заполненными (включен режим GL_FILL).

Мы рассмотрели примитивы “точка”, “линия”, “треугольник”. В принципе, этих примитивов вполне достаточно, чтобы нарисовать все что угодно, пусть даже чересчур громоздким способом. Остальные при­митивы фактически являются усовершенствованными треугольниками и строятся из треугольников. По­строения на основе треугольников являются оптимальными по своим ско­ростным показателям: треугольники строятся наиболее быстро, и именно этот формат чаще всего предлагается для аппаратного ускорения.

Многоугольник

Для рисования прямоугольника на плоскости можно воспользоваться коман­дой glRectf. Это одна из версий команды glRect. Ее аргументом являются координаты двух точек – противоположных углов рисуемого прямоугольни­ка.

Константа GL_QUADS задает примитив, когда перечисляемые вершины берут­ся по четыре и по ним строятся независимые четырехугольники. Следующий код – иллюстрация использования этого примитива: строятся два независимых четырехугольника.

glBegin (GL_QUADS);

glColor3f (random, random, random);

glVertex2f (-0.6, 0.2);

glVertex2f (-0.7, 0.7);

glVertex2f (0.1, 0.65);

glVertex2f (0.25, -0.78);

glColor3f (random, random, random);

glVertex2f (0.3, -0.6);

glVertex2f (0.45, 0.7);

glVertex2f (0.8, 0.65);

glVertex2f (0.9, -0.8);

glEnd;

Результат работы программы приведен на рис. 3.3.



Рис. 3.3. Для построения независимых четырехугольников используется примитив, задаваемый константой GL_QUADS

Примитив, задаваемый константой GL_QUAD_STRIP, состоит из связанных четырехугольников. Первый четырехугольник формируется из вершин номер один, два, три и четыре. Второй четырехугольник в качестве опорных берет вторую, третью, пятую и четвертую вершины и т.д.

Если в предыдущем примере поменять константу на GL_QUAD_STRIP, то изображение в окне получится таким, как на рис. 3.4.



Рис. 3.4. То же, что и рис. 3.3, но константа GL_QUAD_STRIP

Для рисования выпуклого многоугольника используется примитив GL_POLYGON. Многоугольник строится из связанных треугольников с общей вершиной, в качестве которой берется первая среди перечисляемых в ко­мандных скобках. Код для рисования шестиугольника может выглядеть так:

glBegin (GL_POLYGON);

For i := 0 to 6 do

glVertex2f (0.5 * cos (2 * Pi * i / 6), 0.5 * sin (2 * Pi* i / 6)) ;

glEnd;

Результат работы программы приведен на рис. 3.5.



Рис. 3.5. Выпуклый многоугольник

1   2   3   4   5   6   7   8   9   ...   12

Похожие:

Учебник Фамилия, имя, отчество iconФамилия Имя Отчество Занимаемая

Учебник Фамилия, имя, отчество iconФамилия, имя, отчество члена летного экипажа

Учебник Фамилия, имя, отчество iconФамилия, имя отчество члена летного экипажа

Учебник Фамилия, имя, отчество iconКурс Вакантные места Фамилия, имя и отчество заявителя Основание

Учебник Фамилия, имя, отчество iconРезюме фамилия Имя Отчество
Образование: Высшее: Рудненский индустриальный институт. Специальность: Автоматизация и
Учебник Фамилия, имя, отчество iconОбщеобразовательная школа
Фамилия, имя, отчество контактного лица по вопросам инновационной деятельности в образовательном учреждении
Учебник Фамилия, имя, отчество iconФамилия, имя, отчество
Заместитель начальника корпусно-сварочного цеха ОАО «ссрз имени 111 Интернационала»
Учебник Фамилия, имя, отчество iconФамилия Имя Отчество
Необходимое техническое оборудование: презентация осенних пейзажей,запись "Времен года" Чайковского
Учебник Фамилия, имя, отчество iconАнкета Ваши Фамилия Имя Отчество
Комплекс товарного выращивания осетровых в системе замкнутого водообеспечения (узв)
Учебник Фамилия, имя, отчество iconРезюме Фамилия Имя Отчество
Личными качествами считаю: добросовестность, ответственность, исполнительна, целеустремленная, хорошая работоспособность
Разместите кнопку на своём сайте:
Библиотека


База данных защищена авторским правом ©lib.znate.ru 2014
обратиться к администрации
Библиотека
Главная страница