
- •6.080200 – «Інформатика»
- •Лабораторна робота № 3
- •Тема. Функції рисування графічних зображень з використанням різних растрових операцій
- •Мета роботи: ознайомитися з функціями рисування графічних зображень за допомогою бібліотеки opengl.
- •Короткі теоретичні відомості
- •Хід роботи
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 4 Тема. Відображення фігур зі зміною атрибутів
- •Короткі теоретичні відомості
- •Хід роботи
- •Хід роботи
- •Хід роботи
- •Хід роботи
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 9
- •Короткі теоретичні відомості
- •Хід роботи
- •Завдання
- •Контрольні питання
- •Список літератури
- •39614, М. Кременчук, вул. Першотравнева, 20
Хід роботи
Розглянемо програму, що ілюструє побудову процедури 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 ( );
}
Завдання
Вивчіть теоретичний матеріал щодо теми лабораторної роботи.
Дайте відповіді на контрольні запитання.
Розгляньте роботу кожного прикладу програми.
Внесіть зміни у програму так, щоб при зміні розміру вікна зображення фігури завжди було у центрі вікна.
Відобразіть на екрані зображення куба.
Контрольні питання
Для чого потрібен масив вершин і що у ньому зберігається?
Що таке таблиця відображення, які команди використовують для її створення та видалення?
Який механізм дозволяє складати групи зв'язаних таблиць відображень?
Для чого використовуються ідентифікаторами таблиці відображень?
Як організувати компенсацію зміни розмірів вікна?
Література: [4,5].