Курсовая

Курсовая Моделирование и визуализация трехмерного объекта сложной формы

Работа добавлена на сайт bukvasha.net: 2015-10-25

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 25.11.2024





Оглавление

Введение.

1.Теоритическая часть
.


1.1.  Аффинные преобразования.

1.2. OpenGL.

1.3. Ортографическая проекция.

2. Программа.


3.Результаты работы программы.

4. Заключение.
                                                Введение.

  Постановка задачи.

     Курсовая работа заключается в моделировании и визуализации трехмерного объекта сложной формы. Для выполнения курсовой работы студенту необходимо написать программу, осуществляющую визуализацию заданного трехмерного объекта (метод визуализации – каркасный, т.е. без удаления невидимых линий) и позволяющую пользователю управлять перемещениями и трансформациями объекта и/или наблюдателя.

Исходными данными для выполнения курсовой работы являются: трехмерный объект, виды его трансформаций и/или перемещений в пространстве, тип проекции.

Вид объекта.

2 – гантеля (две сферы + цилиндр); 

Тип перемещений и трансформаций объекта.

8 – выполняется масштабирование объекта вдоль осей x и y, вращение объекта вокруг оси y.; тип проекции – кабине;

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

1)                Простота освоения

2)                Наличие эффективных решений

3)                «Мощность программной среды»

4)                Удобство программирования графических объектов.

1.
Теоретическая часть
.


1а. Аффинные преобразования.

Определение 1.

Преобразование плоскости называется аффинным, если оно взаимно однозначно и образом любой прямой является прямая. Преобразование называется взаимно однозначным, если оно разные точки переводит в разные, и в каждую точку переходит какая-то точка.
Частным случаем аффинных преобразований являются просто движения (без какого-либо сжатия или растяжения). Движения — это параллельные переносы, повороты, различные симметрии и их комбинации.

Другой важный случай аффинных преобразований — это растяжения и сжатия относительно прямой. Преобразование - это отображение множества на само себя. Отображение называется взаимооднозначным (биективным), если разные элементы переходят в разные, и в каждый элемент, какой-то элемент переходит.

Определение 2.

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

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

А. Матрицы вращения в пространстве.

Матрица вращения вокруг оси абсцисс на угол  j:




           [ Rx ] =
 
1      0            0         0

0        cos j     sin j     0

                                                          0    -sin j     cos j    0

0         0         0         1

              Матрица вращения вокруг оси ординат на угол y:      

cos y      0   -sin y   0




           [ Ry ] =
 
                                                           0         1         0         1

sin y     0     cos y    0

0         0         0         1
Матрица вращения вокруг оси аппликат на угол c:




           [ Rz ] =
 
cos c   sin c     0      0

                                                 c    cos c    0      0

0         0       1     0

0       0          0      1

Полезно обратить внимание на место знака “ - ” в каждой из трех приведенных матриц.

Б. Матрица растяжения-сжатия:

a      0      0      0


    [ D ] =
 
0      b      0      0

                                                  0      0      g      0

0      0      0      1

где

a > 0 – коэффициент растяжения (сжатия) вдоль оси абсцисс;

b > 0 – коэффициент растяжения (сжатия) вдоль оси ординат;

g > 0 – коэффициент растяжения (сжатия) вдоль оси аппликат.

В
.
Матрицы отражения

    Матрица отражения относительно плоскости ху:

                                                           1      0      0      0


   [Mz] =
 
                                                                                   0      1      0      0

0    0      -1      0

0     0      0      1
Матрица отражения относительно плоскости yz:

-1      0      0      0

                        [Mx]=                 0      1      0      0

0      0      1      0

0      0      0      1

  Матрица отражения относительно плоскости zx:

1      0      0      0

                                    [My]=                                 0      -1      0      0

0      0      1      0

0      0      0      1

Г. Матрица переноса (здесь (l, m, n) - вектор переноса):

1      0      0      0                               


         [T] =
 
                                                 0      1      0      0

0      0      1      0

l      m      n      1

1б.
OpenGL



OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.

Включает более 250-ти функций для рисования сложных трёхмерных сцен из простых примитивов. Используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с Direct3D.

Каркасная модель — модель объекта в трехмерной графике, представляющая собой совокупность вершин и ребер, которая определяет форму отображаемого многогранного объекта.
1в. Ортографическая проекция

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

2.Программа

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

Программа

Текст программы:

//---------------------------------------------------------------------------
#include <windows.h> // Заголовочные файлы для Windows                 

#include "C:\Dev-Cpp\include\gl\gl.h" // Заголовочные файлы для библиотеки OpenGL32 

#include "C:\Dev-Cpp\include\gl\glu.h" // Заголовочные файлы для библиотеки GLu32              

#include "C:\Dev-Cpp\include\gl\glaux.h" // Заголовочные файлы для библиотеки GLaux
HDC                    hDC=NULL;        // Постоянный контекст рендеринга

HGLRC               hRC=NULL;        // Приватный контекст устройства GDI

HWND                 hWnd=NULL; // Здесь будет хранится дескриптор окна

HINSTANCE       hInstance;               // Здесь будет хранится дескриптор приложения
bool   keys[256];                      // Массив, используемый для операций с клавиатурой

bool   active=TRUE;                // Флаг активности окна, установленный в true по умолчанию

bool   fullscreen=FALSE;                   // Флаг режима окна, установленный в полноэкранный по умолчаниюfloat i=0;

static GLfloat        rtri;              // Угол для фигуры

LRESULT  CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);     

// Прототип функции WndProc

GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Изменить размер и инициализировать окно GL

{

         if (height==0)                            // Предотвращение деления на ноль

         {       

        height=1;                                                                                 

         }

         glViewport(0,0,width,height);     // Сброс текущей области вывода

         glMatrixMode(GL_PROJECTION); // Выбор матрицы проекций

         glLoadIdentity();                              // Сброс матрицы проекции

         gluPerspective(45.0f,(GLfloat)width//(GLfloat)height,0.1f,100.0f);

   // Вычисление соотношения геометрических размеров для окна

         glMatrixMode(GL_MODELVIEW);   // Выбор матрицы вида модели

         glLoadIdentity();                           // Сброс матрицы вида модели

}

int InitGL(GLvoid)  // Все установки касаемо OpenGL происходят здесь

{

glShadeModel(GL_SMOOTH);// Разрешить плавное цветовое сглаживание

         glClearColor(0.0f, 0.0f, 0.0f, 0.5f);// Очистка экрана в черный цвет

         glClearDepth(1.0f);                       // Разрешить очистку буфера глубины

         glEnable(GL_DEPTH_TEST);     // Разрешить тест глубины

         glDepthFunc(GL_LEQUAL);       // Тип теста глубины

         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

         // Улучшение в вычислении перспективы

         return TRUE;  // Инициализация прошла успешно

}

                             static float Route=0.15;

                             static float Depth=-6.0;

                             static float MasRotate[3]={0.0f,0.0f,0.0f};

                   int DrawGLScene(GLvoid)

{

         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

         glLoadIdentity();

         glTranslatef(-2.3f,0.0f,Depth);

         glRotatef(rtri,MasRotate[0],MasRotate[1],MasRotate[2]);

   

    glColor3f(1.0f,0.0f,0.0f);  

    auxWireSphere(1.0);

    glTranslatef(4.4f,0.0f,0.0f);

    auxWireSphere(1.0);          

        

     glColor3f(2.0f,2.0f,0.0f); 

     glTranslatef(-1.7f,0.0f,0.0f);

     glRotatef(180,1,1,0);

    auxWireCylinder(0.4, 3.0);

     rtri-=Route;

     return TRUE;

}

GLvoid KillGLWindow(GLvoid) // Корректное разрушение окна

         {

    if (fullscreen )                                 // Мы в полноэкранном режиме?

         {

             ChangeDisplaySettings(NULL,0);

// Если да, то переключаемся обратно в оконный режим

                   ShowCursor(TRUE);          // Показать курсор мышки

         }

         if (hRC)// Существует ли Контекст Рендеринга?

         {

                   If  (!wglMakeCurrent(NULL,NULL))

                                       // Возможно ли освободить RC и DC?

                   {

                            MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

                   }

                   if (!wglDeleteContext(hRC))     // Возможно ли удалить RC?

                   {

                            MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

                   }

                   hRC=NULL; // Установить RC в NULL

         }

         if (hDC && !ReleaseDC(hWnd,hDC))// Возможно ли уничтожить DC?

         {

                   MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

                   hDC=NULL;// Установить DC в NULL

         }

         if (hWnd && !DestroyWindow(hWnd)) // Возможно ли уничтожить окно?

         {

                   MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

                   hWnd=NULL;// Установить hWnd в NULL

         }

         if (!UnregisterClass("OpenGL",hInstance))

                            // Возможно ли разрегистрировать класс

         {

                   MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

                   hInstance=NULL; // Установить hInstance в NULL

         }

}

 BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)

{

         GLuint  PixelFormat; // Хранит результат после поиска

         WNDCLASS  wc; // Структура класса окна

         DWORD dwExStyle; // Расширенный стиль окна

         DWORD dwStyle;         // Обычный стиль окна

         RECT WindowRect;

         WindowRect.left=(long)0;           // Установить левую составляющую в 0

         WindowRect.right=(long)width; // Установить правую составляющую                               

             в Width

         WindowRect.top=(long)0;// Установить верхнюю составляющую в 0

         WindowRect.bottom=(long)height;

         // Установить нижнюю составляющую в Height

         Fullscreen=fullscreenflag;

                   // Устанавливаем значение глобальной переменной fullscreen

         hInstance= GetModuleHandle(NULL);

 // Считаем дескриптор нашего приложения

         wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;         

   // Перерисуем при перемещении и создаём скрытый DC

         wc.lpfnWndProc= (WNDPROC) WndProc;       

   // Процедура обработки сообщений

         wc.cbClsExtra= 0;          // Нет дополнительной информации для окна

         wc.cbWndExtra= 0;// Нет дополнительной информации для окна

         wc.hInstanc = hInstance; // Устанавливаем дескриптор

         wc.hIcon= LoadIcon(NULL, IDI_WINLOGO);

          // Загружаем иконку по умолчанию

         wc.hCursor = LoadCursor(NULL, IDC_ARROW);

          // Загружаем указатель мышки

         wc.hbrBackground= NULL;// Фон не требуется для GL

         wc.lpszMenuName= NULL;// Меню в окне не будет

         wc.lpszClassName         = "OpenGL";// Устанавливаем имя классу
         if (!RegisterClass(&wc)) // Пытаемся зарегистрировать класс окна

         {

                   MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE; // Выход и возвращение функцией значения false

         }

         if (fullscreen)// Полноэкранный режим?

         {

                   DEVMODE dmScreenSettings;// Режим устройства

                   memset(&dmScreenSettings,0,sizeof(dmScreenSettings));

         // Очистка для хранения установок

                   dmScreenSettings.dmSize=sizeof(dmScreenSettings);    

         // Размер структуры Devmode

                   dmScreenSettings.dmPelsWidth= width;// Ширина экрана

                   dmScreenSettings.dmPelsHeight= height;// Высота экрана

                   dmScreenSettings.dmBitsPerPel= bits;// Глубина цвета

                  dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;           // Режим Пикселя

                   // Пытаемся установить выбранный режим и получить результат.  Примечание: CDS_FULLSCREEN убирает панель управления.

                  if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)

                   {

                   // Если переключение в полноэкранный режим невозможно, будет предложено два варианта: оконный режим или выход.

                            if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

                            {

                                      fullscreen=FALSE;

 // Выбор оконного режима (fullscreen = false)

                            }

                            else

                            {

         // Выскакивающее окно, сообщающее пользователю о закрытие окна.

                                      MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);

                                      return FALSE;// Выход и возвращение функцией false

                            }

                   }

         }

                   dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;                      // Расширенный стиль окна

                   dwStyle=WS_OVERLAPPEDWINDOW;                                                           // Обычный стиль окна
         AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);       

            // Подбирает окну подходящие размеры

         if (!(hWnd=CreateWindowEx( dwExStyle,// Расширенный стиль для окна

                   "OpenGL", // Имя класса

                       title,        // Заголовок окна

                   dwStyle |   // Выбираемые стили для окна

                   WS_CLIPSIBLINGS |// Требуемый стиль для окна

                   WS_CLIPCHILDREN, // Требуемый стиль для окна

                   0, 0,                           // Позиция окна

                   WindowRect.right-WindowRect.left,

         // Вычисление подходящей ширины

                   WindowRect.bottom-WindowRect.top,

         // Вычисление подходящей высоты

                   NULL,        // Нет родительского

                   NULL,        // Нет меню

                   hInstance,    // Дескриптор приложения

                     NULL))) // Не передаём ничего до WM_CREATE (???)

         {

                   KillGLWindow();  // Восстановить экран

                   MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE;                // Вернуть false

         }

         static  PIXELFORMATDESCRIPTOR pfd=

         // pfd сообщает Windows каким будет вывод на экран каждого пикселя

         {

                   sizeof(PIXELFORMATDESCRIPTOR),

                                       // Размер дескриптора данного формата пикселей

                   1,      // Номер версии

                   PFD_DRAW_TO_WINDOW |         // Формат для Окна

                   PFD_SUPPORT_OPENGL |// Формат для OpenGL

                   PFD_DOUBLEBUFFER,        // Формат для двойного буфера

                   PFD_TYPE_RGBA,               // Требуется RGBA формат

                   bits,                               // Выбирается бит глубины цвета

                   0, 0, 0, 0, 0, 0,                // Игнорирование цветовых битов

                   0,                                   // Нет буфера прозрачности

                   0,                                   // Сдвиговый бит игнорируется

                   0,                                   // Нет буфера накопления

                   0, 0, 0, 0,                       // Биты накопления игнорируются

                   16,                                 // 16 битный Z-буфер (буфер глубины)

                   0,                                   // Нет буфера трафарета

                   0,                                   // Нет вспомогательных буферов

                   PFD_MAIN_PLANE,    // Главный слой рисования

                   0,                                   // Зарезервировано

                   0, 0, 0                                      // Маски слоя игнорируются

         };

         if (!(hDC=GetDC(hWnd)))

 // Можем ли мы получить Контекст Устройства?

         {

                   KillGLWindow();  // Восстановить экран

                   MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE;// Вернуть false

         }

         if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))

         // Найден ли подходящий формат пикселя?

         {

                   KillGLWindow();  // Восстановить экран

                   MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE;// Вернуть false

         }

         if(!SetPixelFormat(hDC,PixelFormat,&pfd))

                   // Возможно ли установить Формат Пикселя?

         {

                   KillGLWindow();  // Восстановить экран

                   MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE;// Вернуть false

         }

         if (!(hRC=wglCreateContext(hDC))) 

// Возможно ли установить Контекст Рендеринга?

         {

                   KillGLWindow();  // Восстановить экран

                   MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE; // Вернуть false

         }

         if(!wglMakeCurrent(hDC,hRC))

          // Попробовать активировать Контекст Рендеринга

         {

                   KillGLWindow();  // Восстановить экран

                   MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE;// Вернуть false

         }

         ShowWindow(hWnd,SW_SHOW);  // Показать окно

         SetForegroundWindow(hWnd);         // Слегка повысим приоритет

         SetFocus(hWnd);           // Установить фокус клавиатуры на наше окно

         ReSizeGLScene(width, height);

// Настроим перспективу для нашего OpenGL экрана.

         if (!InitGL()) // Инициализация только что созданного окна

         {

                   KillGLWindow();// Восстановить экран

                   MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);

                   return FALSE; // Вернуть false

         }

         return TRUE;// Всё в порядке!

}

LRESULT CALLBACK WndProc(  HWND       hWnd,

// Дескриптор нужного окна

UINT          uMsg,                                       // Сообщение для этого окна

WPARAM           wParam,                         // Дополнительная информация

LPARAM   lParam)                         // Дополнительная информация

{

         switch (uMsg)       // Проверка сообщения для окна

         {

                   case WM_ACTIVATE:  // Проверка сообщения активности окна

                   {

                            if (!HIWORD(wParam))

// Проверить состояние минимизации

                            {

                                      active=TRUE;// Программа активна

                            }

                            else

                            {

                                      active=FALSE;     // Программа теперь не активна

                            }
                            return 0;      // Возвращаемся в цикл обработки сообщений

                   }

                   case WM_SYSCOMMAND:// Перехватываем системную команду

                   {

                            switch (wParam)   // Останавливаем системный вызов

                            {

                                      case SC_SCREENSAVE:       

          // Пытается ли запустится скринсейвер?

                                      case SC_MONITORPOWER:

         // Пытается ли монитор перейти в режим сбережения энергии?

                                      return 0;      // Предотвращаем это

                            }

                            break;                            // Выход

                   }

                   case WM_CLOSE:        // Мы получили сообщение о закрытие?

                   {

                            PostQuitMessage(0);      // Отправить сообщение о выходе

                            return 0;                         // Вернуться назад

                   }

                   case WM_KEYUP: // Была ли нажата кнопка?

                   {

                      if( wParam=='A') Depth+=0.5;

                      if( wParam=='Z') Depth-=0.5;

                            if( wParam=='S') Route+=0.05;

                                      if( wParam=='X') Route-=0.05;

                      if( wParam=='Q')MasRotate[0]=!MasRotate[0];

                             if( wParam=='W')MasRotate[1]=!MasRotate[1];

                               if( wParam=='E')MasRotate[2]=!MasRotate[2];

                    return 0;

                   }

                   case WM_SIZE:   // Изменены размеры OpenGL окна

                   {

                            ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); 

          // Младшее слово=Width, старшее слово=Height

                            return 0;      // Возвращаемся

                   }

         }

         // пересылаем все необработанные сообщения DefWindowProc

         return DefWindowProc(hWnd,uMsg,wParam,lParam);

}

int WINAPI WinMain(    HINSTANCE       hInstance,// Дескриптор приложения

                   HINSTANCE       hPrevInstance,

// Дескриптор родительского приложения

                   LPSTR lpCmdLine,// Параметры командной строки

                   Int nCmdShow)      // Состояние отображения окна

{

         MSG msg;  // Структура для хранения сообщения Windows

         BOOL done=FALSE;    // Логическая переменная для выхода из цикла
         // Создать наше OpenGL окно

         if (!CreateGLWindow("OpenGL",640,480,16,fullscreen))

         {

                   return 0;// Выйти, если окно не может быть создано

  }     

         while(!done) // Цикл продолжается, пока done не равно true

         {

                   if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

         // Есть ли в очереди какое-нибудь сообщение?

                   {

                            if (msg.message==WM_QUIT)

                                      // Мы получили сообщение о выходе?

                            {

                                      done=TRUE;// Если так, done=true

                            }

                            else    // Если нет, обрабатывает сообщения

                            {

                                      TranslateMessage(&msg);// Переводим сообщение

                                      DispatchMessage(&msg);// Отсылаем сообщение

                            }

                   }

                   else             //  Если нет сообщений

                   {

             // Прорисовываем сцену.

                            if ((active && !DrawGLScene()) || keys[VK_ESCAPE])

            // Активна ли программа?

                            {

                                      done=TRUE;// Было ли нажата клавиша ESC?

                            }

                            else    // ESC говорит об останове выполнения программы

                            {

                                      SwapBuffers(hDC);

           // Не время для выхода, обновим экран.

                            }

                            if (keys[VK_F1])  // Была ли нажата F1?

                            {

                                      keys[VK_F1]=FALSE;

                                      // Если так, меняем значение ячейки массива на false

                                      KillGLWindow();  // Разрушаем текущее окно

                                      fullscreen=!fullscreen;// Переключаем режим

                                       // Пересоздаём наше OpenGL окно

                            if(!CreateGLWindow("OpenGL",1024,768,32,fullscreen))

                                      {

                                               return 0;// Выходим, если это невозможно

                                      }

                            }

                   }

         }

         KillGLWindow();  // Разрушаем окно

         return (msg.wParam); // Выходим из программы

}
Результаты работы программы.

Безымян1
                                                          Безымян11

Безымянный
Заключение
.


С помощью OpenGl была построена, и подвергнута преобразованиям искомая фигура.

1. Реферат на тему Регулирование международных кредитных и валютных отношений
2. Реферат на тему Julius Caesar Flattery Essay Research Paper Flattery
3. Контрольная работа по Истории 2
4. Контрольная работа Технология приготовления некоторых блюд Основы санитарии и охраны труда на пищевых предприятиях
5. Курсовая на тему Источники формирования капитала предприятия и его размещение
6. Реферат на тему Lincoln Essay Research Paper Over the past
7. Реферат Нагляд за додержанням законів при виконанні судових рішень у кримінальних справах Система органів
8. Реферат CRM управление продажами и контактами
9. Реферат на тему Клинико-анатомические особенности строения костной орбиты - по книге профессора Краснова
10. Реферат на тему The Klan Essay Research Paper The Klan