МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
ЗВІТ
до лабораторної роботи №4
на тему:
“ ДВОМІРНІ ПОБУДОВИ З ВИКОРИСТАННЯМ OpenGL ЗАСОБАМИ МОВИ C++”
з курсу:
« Геометричне моделювання у конструюванні інженерних обєктів та систем »
Основні теоретичні відомості
Текст програми:
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <math.h>
#include <stdio.h>
#define pi 3.14159265
const int minX = 0, minY = 0, maxX = 26, maxY = 10;
static bool state = true;
void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(minX,maxX, minY,maxY, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}
void drawRound(double left, double top, float radius, float rL, float gL, float bL)
{
float tmpY=0;
float tmpX=0;
float step = radius/(10*radius);
glBegin(GL_LINE_LOOP);
for(float i = -radius; i<=radius; i+=step)
{
glColor3f(rL,gL,bL);
tmpY = sqrt(pow(radius,2)-pow(i,2));
glVertex2d(left+i, top+tmpY);
}
for(float i = radius; i>=-radius; i-=step)
{
tmpY = -sqrt(pow(radius,2)-pow(i,2));
glVertex2d(left+i, top+tmpY);
}
glEnd();
glFlush();
}
void drawStar(double left, double top, double radiusB, double radiusS, int count, float rL, float gL, float bL, float rF, float gF, float bF)
{
float mainAngle = 2*pi/count;
float smallAngle = mainAngle/2;
glLineWidth(1);
drawRound(left, top, radiusB, rL,gL,bL);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_POLYGON);
for(int i = 0; i<count; i++)
{
glColor3f(rL,gL,bL);
glVertex2f(left,top);
glVertex2f(left+radiusB*sin(i*mainAngle),top+radiusB*cos(i*mainAngle));
glVertex2f(left+radiusS*sin((2*i+1)*smallAngle),top+radiusS*cos((2*i+1)*smallAngle));
}
glEnd();
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBegin(GL_POLYGON);
for(int i = 0; i<count; i++)
{
glColor3f(rF, gF, bF);
glVertex2f(left,top);
glVertex2f(left+radiusB*sin(i*mainAngle),top+radiusB*cos(i*mainAngle));
glVertex2f(left+radiusS*sin((2*i-1)*smallAngle),top+radiusS*cos((2*i-1)*smallAngle));
}
glEnd();
glFlush();
}
void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
drawStar(5,5,3,1,5,0.0,0.5,1.0,1.0,0.5,0.0);
drawStar(13,5,3,2,6,0.0,0.5,1.0,1.0,0.5,0.0);
drawStar(21,5,3,2,8,0.0,0.5,1.0,1.0,0.5,0.0);
auxSwapBuffers();
}
void main()
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};
auxInitPosition( 50, 50, 800, 300);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( (LPWSTR)"Bubela Andriy - OpenGL" );
auxIdleFunc(display);
auxReshapeFunc(resize);
glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
auxMainLoop(display);
}
Результат роботи програми:
Висновок:
На даній лабораторній роботі я ознайомився та практично освоїв технології та основи роботи з графічними можливостями бібліотеки OpenGL на площині в середовищі Windows. Вивчив особливості підключення бібліотек при розробці програмних проектів. Ознайомився та засвоїв основні графічні функції, набув практичних навиків програмування графіки.