Компьютерная графика. Lab1. Алгоритмы построения графических примитивов. Использование библиотек двумерной графики GDI и GDI+

Задание:

При выполнении работы необходимо сделать следующее.

  1. Изучить основы программирования для Windows на WinAPI. (книга Петцольда «Программирование для Windows 95», глава 2).
  2. Изучить основы программирования двумерной графики с помощью библиотеки GDI. (книга Петцольда «Программирование для Windows 95», глава 4, нелишне изучить 3 и 5).
  3. Ознакомиться с заготовкой программы – файл gdia.cpp.
  4. В заготовке программы приведен пример простого построения горизонтальных линий.
  5. Обратите внимание на функцию OnGDILines. В ней показан вывод прямой линии с помощью функций GDI. Измените функцию (включая, возможно, название), чтобы она рисовала графические примитивы вашего варианта. При этом используйте библиотечные функции GDI рисования линий, окружностей, эллипсов и т. д.
  6. Обратите внимание на функцию OnMyGDILines. В ней показан вывод прямой линии по точкам. Измените функцию, реализовав в ней заданный вам алгоритм (Брезенхема или средней точки) для рисования необходимых примитивов. Для вывода точки на экран будет использоваться функция SetPixel. Вывод через SetPixel – очень неэффективный способ вывода на экран. Поэтому ваша реализация алгоритма в этой функции будет самой медленной.
  7. Изучите основы программирования двумерной графики с помощью GDI+ (MSDN, книга Петцольда «Программирование для Windows на C#» — где-то в \\SERVER\For All\!Документация\!Книги).
  8. Обратите внимание на функцию OnGDIPlusLines. Она похожа на 1 OnGDILines, только для вывода линий используются функции GDI+. Измените функцию так, чтобы она рисовала заданные вам графические примитивы с помощью библиотечных функций GDI+.
  9. Обратите внимание на функцию OnGDIPlusBMPLines. В ней используется другой подход к рисованию на экране. Сначала в памяти создается битовый образ, затем рисование графических примитивов происходит не на экран, а в битовый образ, после чего полученный битовый образ выводится на экран. Этот подход более эффективен с точки зрения производительности, и при использовании GDI+ он очень легко реализуется. Измените функцию так, чтобы она рисовала заданные вам графические примитивы.
  10. Обратите внимание на функцию OnGDIBMPLines. В ней предыдущий подход (из пункта 9) реализован с помощью функций библиотеки GDI. Пожалуй, это самый эффективный по быстродействию способ. Измените функцию так, чтобы она рисовала заданные вам графические примитивы.
  11. Обратите внимание на функцию OnGDIPlusBMPOwnDrawLines. В ней тоже производится промежуточный вывод в битовый образ, только на сей раз не с помощью библиотечных функций рисования графических примитивов, а путем прямого доступа к массиву цветов пикселей битового образа. Измените функцию, чтобы в ней реализовывался заданный вам алгоритм, как и в пункте 6, только вместо вывода на экран с помощью SetPixel, вывод будет производиться в битовый образ путем прямого доступа к цветам пикселей. Постарайтесь сделать свою реализацию как можно более эффективной, чтобы, по возможности, она давала лучшее быстродействие, чем функция из предыдущего пункта.
  12. 12.Во всех функциях должны строиться графические примитивы со случайными координатами и случайными цветами.
  13. Сравните реализованные методы по быстродействию. Сделайте выводы.

Контекст устройства

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

Контекст устройства фактически является структурой данных, которая внутренне поддерживается GDI. Контекст устройства связан с конкретным устройством вывода информации, таким как принтер, плоттер или дисплей. Что касается дисплея, то в данном случае контекст устройства обычно связан с конкретным окном на экране.

Некоторые значения в контексте устройства являются графическими «атрибутами» (attributes). Эти атрибуты определяют некоторые особенности работы функций рисования GDI. Например, для функции TextOut эти атрибуты контекста устройства задают цвет текста, цвет фона для текста, процедуру преобразования координат x и y, передаваемых функции TextOut в координаты рабочей области, а также шрифт, используемый для вывода текста.

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

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

 

СМЫСЛ ФУНКЦИИ SelectObject

Смысл функции SelectObject в том, что она выбирает соответствующий объект (PEN, например) и в дальнейшем графические функции будут рисовать с использованием этого объекта

 

ОТЛИЧИЕ ПОДХОДА В GDI+ ОТ GDI

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

 

ДЕЙСТВИЯ, НЕОБХОДИМЫЕ ДЛЯ ИСПОЛЬЗОВАНИЯ GDI+

Для использования GDI+ в программе необходимо подключить заголовочный файл “GDIPLUS.H” и в настройках прописать библиотеку “GDIPLUS.LIB”.

 

ОТЛИЧИЯ НЕПОСРЕДСТВЕННОГО ВЫВОДА НА ЭКРАН ОТ ИСПОЛЬЗОВАНИЯ В КАЧЕСТВЕ БУФЕРА БИТОВОГО ОБРАЗА

При использовании битового образа в качестве буфера цвета непосредственно заносятся на своё место в буфере. Прорисовка на экран осуществляется только после заполнения всего буфера, что ускоряет процесс.

 

РЕАЛИЗАЦИЯ АЛГОРИТМА ПОСТРОЕНИЯ СЕГМЕНТА

Для ускорения некоторые переменные были описаны как register и сама функция как _fastcall.

 

 

СРАВНИТЕЛЬНАЯ ТАБЛИЦА РАЗЛИЧНЫХ РЕАЛИЗАЦИЙ ВЫВОДА ГРАФИЧЕСКИХ ПРИМИТИВОВ

Реализация Сравнительное время (мс)
GDI+ 263,4400
GDI 555,6300
Вывод с помощью функции GDI SetPixel и реализованным алгоритмом 1156,0000
Прорисовка на BMP в GDI+ функцией GDI+ 187,3400
Прорисовка на BMP с прямым доступом к пикселям в GDI+ реализованным алгоритмом 100,310
Прорисовка на BMP в GDI функцией GDI 140,4700

 

ВЫВОДЫ О БИБЛИОТЕКАХ GDI и GDI+

 

По скорости работы и понятности GDI+ заметно превосходит GDI.

Скачать ZIP-архив с исходными кодами

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *