МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
Розрахунково-графічна робота
з курсу «Програмування комп’ютерної графіки»
Виконав:ст. гр. ЗІ-31
Прийняв:
Львів – 2011
Мета роботи - набути практичних навиків в складанні програм для побудови зображень на екрані комп’ютера за допомогою засобів мови С.
Завдання 1
Побудувати графік функції заданої таблично.
y=log(x) x [1;20]
Текст програми
#include<windows.h>
#include<stdio.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glaux.h>
#include<math.h>
#include<stdarg.h>
void CALLBACK resize(intwidth,intheight)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}
voidmath(double x[2],double t)
{
x[0]=0.5*log(t);
x[1]=0.5*t;
}
void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
double i, h=0.1;
double k=0.4;
double x[2]={0,0};
double y[2]={0,0};
glLineWidth(1);
glBegin(GL_LINES);
glColor3d(0,1,0);
glVertex2f(0,-3.5);
glVertex2f(0,3.5);
glColor3d(0,1,0);
glVertex2f(-3.5,0);
glVertex2f(3.5,0);
for(i=-6;i<7;i++)
{
glLineWidth(1);
glBegin(GL_LINES);
glColor3d(0,1,0);
glVertex2f(i*k,0.2*k);
glVertex2f(i*k,-0.2*k);
glColor3d(0,1,0);
glVertex2f(-0.2*k,i*k);
glVertex2f(0.2*k,i*k);
glEnd();
}
for(i=1;i<8;i+=h)
{
math(x,i);
glPointSize(2);
glBegin(GL_POINTS);
glColor3d(1,0,0);
glVertex3d(x[0],x[1],0);
glEnd();
}
glDisable(GL_POINT_SMOOTH); // Відключення режиму згладжування для крапок
auxSwapBuffers();
}
voidmain()
{
floatpos[4] = {3,3,3,1};
floatdir[3] = {-1,-1,-1};
GLfloatmat_specular[] = {1,1,1,1};
auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "GlauxTemplate" );
auxIdleFunc(display);
auxReshapeFunc(resize);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, 128.0);
auxMainLoop(display);
}
Результат роботи програми
/
Завдання 2
Створити на екрані комп’ютера графічне вікно і сформувати в ньому рухоме зображення:
Коло зі спицями діаметром d рухається з лівого верхнього кута прямокутного вікна розмірами 180x160 по прямій лінії під кутом (до нижньої сторони вікна з одночасним обертанням спиць навколо центру кола. Потім коло продовжує рух по прямій лініях під кутом падіння, відбиваючись від інших сторін вікна.Параметри : (=45(,d=24
Текст програми
#include<windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <stdlib.h>
#include <time.h>
#define racket_w 2
#define racket_deltaracket_w/2
#define initial_vilocity 0.1
#define radius 0.5
double x, y;
doubleracket_x=0;
doublevx, vy;
double right = 5, left = -5, top = 5, bottom = -5;
void CALLBACK Key_LEFT(void )
{
if(racket_x>left)
racket_x -= racket_delta;
}
void CALLBACK Key_RIGHT(void )
{
if(racket_x+racket_w<right)
racket_x += racket_delta;
}
intCatched()
{
if(x>racket_x&& x<racket_x+racket_w)
return 1;
else
return 0;
}
voidGetNextXY()
{
x += vx;
y += vy;
if(x-radius<left || x+radius>right)
{
vx = -vx;
x += 2*vx;
}
if(y+radius>top || (y-radius<bottom &&Catched()) )
{
vy = -vy;
y += 2*vy;
}
}
voidDrawBall()
{
glPushMatrix();
glTranslated(x,y,0);
glColor3d(1,0,0);
auxSolidSphere(radius);
glPopMatrix();
}
void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
GetNextXY();
DrawBall();
if(y-radius<bottom)
auxQuit();
auxSwapBuffers();
}
void CALLBACK resize(intwidth,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}
void main()
{
floatpos[4] = {3,3,3,1};
floatdir[3] = {-1,-1,-1};
srand(time(0));
vx=initial_vilocity+((double)(rand()%50))/1000.0;
vy=initial_vilocity+((double)(rand()%50))/1000.0;
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);
auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Game --- Arcanoid" );
auxIdleFunc(display);
auxReshapeFunc(resize);
auxKeyFunc(AUX_LEFT, Key_LEFT);
auxKeyFunc(AUX_RIGHT, Key_RIGHT);
auxMainLoop(display);
}
Результат роботипрограми
/
/
Висновок: на даній лабораторній роботі я набув практичних навиків в складанні програм для побудови зображень на екрані комп’ютера за допомогою засобів мови С.