Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка OpenGL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
504.83 Кб
Скачать

Хід роботи

Розглянемо програму, що ілюструє побудову процедури winReshapeFcn. Команда glLoadIdentity, що входить до функції зміни форми, контролює попередні значення проекційних параметрів таким чином, що вони не впливають на утворення нових проекцій. Шестикутник задається в рамках таблиці відображення, у якій записуються тільки початкові координати центра. Тому на положення самого шестикутника не впливають ніякі зміни розміру вікна. Якщо потрібно буде змінити положення шестикутника при зміні розмірів вікна зображення, потрібно буде описати шестикутник іншим чином або змінити систему координат вікна зображення.

#include <GL/glut.h>

#include <math.h>

#include <stdlib.h>

const double TWO_PI = 6.2831853;

/* Вихідні розміри вікна зображення. */

GLsizei winWidth = 400, winHeight - 400; GLuint regHex;

class screenPt {

private:

GLint x, y;

public:

/*За замовчанням точці присвоюються координати (0, 0).*/

screenPt ( ) {

х = у = 0;}

void setCoords (GLint xCoord, GLint yCoord) {

x = xCoord;

у - yCoord;

}

GLint getx ( ) const {

return x;}

GLint gety ( ) const {

return y;}

};

static void init (void) {

screenPt hexVertex, circCtr;

GLdouble theta;

GLint k;

/* Задаються координати центра кола. */

circCtr.setCoords (winWidth / 2, winHeight / 2);

glClearColor (1.0, 1.0, 1.0, 0.0);

// Колір вікна зображення вибирається білим.

/* Задається таблиця відображення червоного правильного *шестикутника. */

regHex = glGenLists (1);

//Таблиці відображення присвоюється ідентифікатор.

glNewList (regHex, GL_COMPILE);

glColor3f (1.0, 0.0, 0.0);

//Колір заповнення шестикутника призначається червоний.

glBegin (GL_POLYGON);

for (k =0; k < 6; k++) {

theta - TWO_PI * k / 6.0;

hexVertex.setCoords (circCtr.getx ( ) +

150 * cos (theta), circCtr.gety ( ) +

150 * sin (theta));

glVertex2i (hexVertex.getx(), hexVertex.gety ( ));}

glEnd ( );

glEndList ( );

}

void regHexagon (void) {

glClear (GL_COLOR_BUFFER_BIT);

glCallList (regHex);

glFlush ( );

}

void winReshapeFcn (int newWidth, int newHeight) {

glMatrixMode (GL_PROJECTION);

glLoadldentity ( );

gluOrtho2D (0.0, (GLdouble) newWidth, 0.0, (GLdouble)

newHeight);

glClear (GL_COLOR_BUFFER_BIT);

}

void main (int argc, char** argv) {

glutlnit (&argc, argv);

glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutlnitWindowPosition (100, 100);

glutlnitWindowSize (winWidth, winHeight);

glutCreateWindow ("Приклад функції зміни форми і таблиці відображень");

init ( );

glutDisplayFunc (regHexagon);

glutReshapeFunc (winReshapeFcn);

glutMainLoop ( );

}

Завдання

  1. Вивчіть теоретичний матеріал щодо теми лабораторної роботи.

  2. Дайте відповіді на контрольні запитання.

  3. Розгляньте роботу кожного прикладу програми.

  4. Внесіть зміни у програму так, щоб при зміні розміру вікна зображення фігури завжди було у центрі вікна.

  5. Відобразіть на екрані зображення куба.

Контрольні питання

    1. Для чого потрібен масив вершин і що у ньому зберігається?

    2. Що таке таблиця відображення, які команди використовують для її створення та видалення?

    3. Який механізм дозволяє складати групи зв'язаних таблиць відображень?

    4. Для чого використовуються ідентифікаторами таблиці відображень?

    5. Як організувати компенсацію зміни розмірів вікна?

Література: [4,5].