Контрольная работа

Контрольная_работа на тему Создание компьютерной графики при помощи OpenGL

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

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

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

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

от 25%

Подписываем

договор

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

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


  1. Напишите программу вывода графика функции y= tg (x)+5*cos (x), с помощью точек, а затем с помощью линий.

    1. С помощью точек

Решение:

#include <windows.h>

#include <gl\gl.h>

#include <gl\glu.h>

#include <gl\glaux.h>

#include <math.h>

GLint windW, windH;

void CALLBACK Reshape(int width, int height)

{ glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-15,15,-15,15);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK Draw(void)

{

glClearColor(1.0,1.0,1.0,1);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_LINES);

glColor3ub(190,190,190);

for (int i=-4; i<=4; i++)

{

glVertex2f(float(i), -6);//явное преобразование типа

glVertex2f(float(i), 15);

}

for (i=-6; i<=15; i++)

{

glVertex2f(-4, float(i));

glVertex2f(4, float(i));

}

glEnd();

glColor3ub(0,0,0);

glBegin(GL_LINES);

glVertex2f (-5, 0);

glVertex2f(5, 0);

glVertex2f(0,16);

glVertex2f(0,-7);

glEnd();

glPointSize(2);

glBegin(GL_POINTS);

glColor3ub(0,0,255);

int n;

double a,b,dx,x,y;

a=-1.415;

b=1.5;

n=20;

dx=(b-a)/(n-1);

x=a;

y=0;

for (i=1; i<=n; i++)

{

y=float(tan(x)+5*cos(x));

glVertex2d (x, y);

x=x+dx;

}

glEnd();

glFinish();

auxSwapBuffers();

}

void main(int argc, char **argv)

{

windW = 800;

windH = 800;

auxInitPosition(100, 100, windW, windH);

auxInitDisplayMode(AUX_RGB | AUX_DOUBLE);

auxInitWindow("v11_01_1");

glTranslated(0,-4,0);

auxReshapeFunc(Reshape);

auxMainLoop(Draw);

}

Результат:

    1. с помощью линий

Решение:

#include <windows.h>

#include <gl\gl.h>

#include <gl\glu.h>

#include <gl\glaux.h>

#include <math.h>

GLint windW, windH;

void CALLBACK Reshape(int width, int height)

{ glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-15,15,-15,15);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK Draw(void)

{

glClearColor(1.0,1.0,1.0,1);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_LINES);

glColor3ub(190,190,190);

for (int i=-4; i<=4; i++)

{

glVertex2f(float(i), -6);//явное преобразование типа

glVertex2f(float(i), 15);

}

for (i=-6; i<=15; i++)

{

glVertex2f(-4, float(i));

glVertex2f(4, float(i));

}

glEnd();

glColor3ub(0,0,0);

glBegin(GL_LINES);

glVertex2f (-5, 0);

glVertex2f(5, 0);

glVertex2f(0,16);

glVertex2f(0,-7);

glEnd();

glBegin(GL_LINE_STRIP);

glColor3ub(0,0,255);

int n;

double a,b,dx,x,y;

a=-1.415;

b=1.5;

n=100;

dx=(b-a)/(n-1);

x=a;

y=0;

for (i=1; i<=n; i++)

{

y=float(tan(x)+5*cos(x));

glVertex2d (x, y);

x=x+dx;

}

glEnd();

glFinish();

auxSwapBuffers();

}

void main(int argc, char **argv)

{

windW = 800;

windH = 800;

auxInitPosition(100, 100, windW, windH);

auxInitDisplayMode(AUX_RGB | AUX_DOUBLE);

auxInitWindow("v11_01_1");

glTranslated(0,-4,0);

auxReshapeFunc(Reshape);

auxMainLoop(Draw);

}

Результат:

  1. Нарисуйте каркас призмы, в основании которой лежит правильный 14-угольник

Решение:

//v11_02

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include <math.h>

void CALLBACK resize (int width, int height)

{

glViewport (0,0,width, height);

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

glOrtho(-15,15,-10,10, -10,20);

gluLookAt(1,-1,1, 0,0,0, 0,0,1);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK display (void)

{

GLUquadricObj *quadObj;

quadObj = gluNewQuadric();

glClearColor(1.0,1.0,1.0,1);

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3d(0,0,1);

// каркас

gluQuadricDrawStyle(quadObj, GLU_SILHOUETTE);

//призма в основании которой лежит правильный 14-угольник

gluCylinder(quadObj, 2, 2, 5, 14, 14);

glBegin(GL_LINES);

glColor3ub(0, 0, 0);

glVertex2f(6, 0);

glVertex2f(-6, 0);

glVertex2f(0, 6);

glVertex2f(0, -6);

glVertex3f(0, 0, 0);

glVertex3f(0, 0, 8);

for (int i=-5; i<=5; i++)

{

if (i!=0)

{

glColor3ub(190,190,190);

glVertex2f(float(i), -5);

glVertex2f(float(i), 5);

}

}

for (i=-5; i<=5; i++)

{

if (i!=0)

{

glColor3ub(190,190,190);

glVertex2f(-5, float(i));

glVertex2f(5, float(i));

}

}

glEnd();

glFinish();

auxSwapBuffers();

}

void main ()

{

auxInitPosition (100,100,800,600);

auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

auxInitWindow ("v11_02");

glScaled(1.5, 1.5, 1.5);

glTranslated(0,0,-1);

auxIdleFunc (display);

auxReshapeFunc(resize);

glEnable (GL_DEPTH_TEST);

auxMainLoop(display);

}

Результат:

  1. Напишите программу вывода графика функции x=2*sin(z)*cos(y)-3*tg(y) используя алгоритм плавающего горизонта. Модифицируйте программу таким образом, чтобы поверхность состояла из четырехугольников

Решение:

#include <windows.h>

#include <gl\gl.h>

#include <gl\glu.h>

#include <gl\glaux.h>

#include <math.h>

// запретить вывод предупреждений о преобразовании данных

#pragma warning(disable: 4305) // MIPS

#pragma warning(disable: 4244) // MIPS

GLint windW, windH;

void CALLBACK Reshape(int width, int height)

{

windW = (GLint)width;

windH = (GLint)height;

}

int alpha=0, beta=0;

void CALLBACK Key_LEFT(void)

{

alpha -= 5;

}

void CALLBACK Key_RIGHT(void)

{

alpha += 5;

}

void CALLBACK Key_UP(void)

{

beta += 5;

}

void CALLBACK Key_DOWN(void)

{

beta -= 5;

}

void CALLBACK InitViewport(int x, int y, int width, int height)

{

glViewport(x, y, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-windW,windW, -windH,windH, windH/1000,windH*1000);

gluLookAt(0,0,windH, 0,0,0, 1,0,0);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK Draw(void)

{

float x,y,z;

float d=10;

InitViewport(0,0, windW, windH);

glColor3d(0,1,0);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

for (y=-windH/1.3; y<=windH/1.3; y+=10)

{glBegin(GL_QUADS);

for (z=-windW/1.3; z<=windW/1.3; z+=10)

{

x=2*sin(z)*cos(y)-3*tan(y);

glVertex3f(x,y,z);

glVertex3f(x,y+d,z);

x=2*sin(z+d)*cos(y+d)-3*tan(y+d);

glVertex3f(x,y+d,z+d);

glVertex3f(x,y,z+d);

}

glEnd();

}

glFinish();

}

void CALLBACK Turn(void)

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glRotated(alpha, 0,1,0);

glRotated(beta, -1,0,0);

Draw();

glPopMatrix();

auxSwapBuffers();

glFinish();

}

void main(int argc, char **argv)

{

windW = 800;

windH = 600;

auxInitPosition(0, 0, windW, windH);

auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

if(auxInitWindow("v11_03") == GL_FALSE) {

auxQuit();

}

auxExposeFunc((AUXEXPOSEPROC)Reshape);

auxReshapeFunc((AUXRESHAPEPROC)Reshape);

auxIdleFunc(Turn);

auxKeyFunc(AUX_LEFT, Key_LEFT);

auxKeyFunc(AUX_RIGHT, Key_RIGHT);

auxKeyFunc(AUX_UP, Key_UP);

auxKeyFunc(AUX_DOWN, Key_DOWN);

auxMainLoop(Turn);

}

Результат:

  1. Напишите программу вывода вращающего тора относительно своей оси x, с одновременным движением по следующей траектории z=sin(y)

Решение:

//v11_04

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include <math.h>

int flag=1;

void CALLBACK resize (int width, int height)

{

glViewport (0,0,width, height);

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

glOrtho(-15,15,-10,10, -10,20);

gluLookAt(1,-1,1, 0,0,0, 0,0,1);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK display (void)

{

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3d(0,1,0);

float pos[4]={0,7.5,7.5,1};

static double time=0;

float y,z;

y=0;

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_POSITION, pos);

glPushMatrix();

y=float(time/100);

z=float(sin(y)); // float(); преобразование типа

//движением по следующей траектории z=sin(y)

glTranslated(0,y,z);

//вращающего тора относительно оси x

glRotated(time,1,0,0);

if (y>11 && flag==1)

{

flag=2;

}

if (y<-4 && flag==2)

{

flag=1;

}

if (flag==2)

{

time--;

}

else

{

time++;

}

auxSolidTorus(0.15, 0.5);

glPopMatrix();

// система координат XYZ

glBegin(GL_LINES);

glColor3ub(255, 0, 0);

glVertex3f(5, 0, 0);

glVertex3f(-5, 0, 0);

// х красный

glColor3ub(0, 255, 0);

glVertex3f(0, 11, 0);

glVertex3f(0, -4, 0);

// y зеленый

glColor3ub(0, 0, 255);

glVertex3f(0, 0, 0);

glVertex3f(0, 0, 5);

// z синий

glEnd();

glFinish();

auxSwapBuffers();

}

void main ()

{

auxInitPosition (100,100,800,600);

auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

auxInitWindow ("v11_04");

glScaled(1.5, 1.5, 1.5);

glTranslated(0,-3,0);

auxIdleFunc (display);

auxReshapeFunc(resize);

glEnable (GL_DEPTH_TEST);

glEnable (GL_COLOR_MATERIAL);

auxMainLoop(display);

}

Результат:

  1. Напишите программу мерцающего звездного неба

Решение:

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include<time.h>

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <math.h>

int t_sec() // считывание секунд с системных часов

{

struct tm *newtime;

time_t aclock;

time(&aclock);

newtime = localtime(&aclock);

asctime(newtime);

int s=newtime->tm_sec;

return s;

}

void CALLBACK resize (int width, int height)

{

glViewport (0,0,width, height);

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-100,100,-100,100);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK Draw (void)

{

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

int c, x, y, p;

srand(t_sec());

//задание стартовой точки

//для генерации случайных чисел

for(int i=0; i<1000; i++)

{

c=rand()%255; //генерация случайных чисел от 0 до 255

x=rand()%200; //генерация случайных чисел от 0 до 200

y=rand()%200; //генерация случайных чисел от 0 до 200

p=rand()%3;

glPointSize(p);

glBegin(GL_POINTS);

glColor3ub(c,c,c);

glVertex2d(x,y);

glEnd();

}

auxSwapBuffers();

}

void main ()

{

auxInitPosition (100,100,800,800);

auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

auxInitWindow ("v11_06");

glTranslated(-100,-100,0);

auxIdleFunc (Draw);

auxReshapeFunc (resize);

glEnable (GL_DEPTH_TEST);

glEnable (GL_COLOR_MATERIAL);

auxMainLoop(Draw);

}

Результат:

  1. Изобразите радугу состоящую из полигонов, которая освещается прожектором. Направление света прожектора постоянно меняется и скользит вдоль радуги

Решение:

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include<time.h>

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <math.h>

int flag=1;

void CALLBACK resize (int width, int height)

{

glViewport (0,0,width, height);

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

//glOrtho(-20,20,-15,15, -10,25);

glOrtho(-6,6,-6,6, -20,20);

gluLookAt(1,-1,1, 0,0,0, 0,0,1);

//gluLookAt(0,-5,0, 0,0,0, 0,0,1);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK Draw (void)

{

static double time=0;

GLUquadricObj *quadObj;

quadObj = gluNewQuadric();

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

float x=time/100-2.2;

float z=pow((pow(2.4,2)-pow(x,2)),0.5);

if (x>2.2 && flag==1)

{

flag=2;

}

if (x<-2.2 && flag==2)

{

flag=1;

}

if (flag==2)

{

time--;

}

else

{

time++;

}

float dir[3]={x,0.1,z};

float pos[4]={0,-1,0,1};

// включение нулевой лампы

GLfloat light_diffuse[]={3.0,3.0,3.0,1.0};

glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse);

glLightfv(GL_LIGHT0, GL_POSITION, pos);

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 90);

glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 9);

glEnable(GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_DEPTH_TEST);

glPopMatrix();

glPushMatrix();

glRotated(90,1,0,0);

gluQuadricDrawStyle(quadObj, GLU_FILL);

// К

glColor3ub(255, 0, 0);

gluPartialDisk(quadObj, 2, 2.2, 30, 30, -90, 180);

// О

glColor3ub(255, 125, 0);

gluPartialDisk(quadObj, 2.2, 2.4, 30, 30, -90, 180);

// Ж

glColor3ub(255, 255, 0);

gluPartialDisk(quadObj, 2.4, 2.6, 30, 30, -90, 180);

// З

glColor3ub(0, 255, 0);

gluPartialDisk(quadObj, 2.6, 2.8, 30, 30, -90, 180);

// Г

glColor3ub(0, 255, 255);

gluPartialDisk(quadObj, 2.8, 3, 30, 30, -90, 180);

// С

glColor3ub(0, 0, 255);

gluPartialDisk(quadObj, 3, 3.2, 30, 30, -90, 180);

// Ф

glColor3ub(255, 0, 255);

gluPartialDisk(quadObj, 3.2, 3.4, 30, 30, -90, 180);

glPopMatrix();

glDisable(GL_LIGHTING);

auxSwapBuffers();

}

void main ()

{

auxInitPosition (100,100,800,800);

auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

auxInitWindow ("v11_06");

glTranslated(3,-3,2);

glEnable (GL_COLOR_MATERIAL); // установка свойств материала

auxIdleFunc (Draw);

auxReshapeFunc (resize);

auxMainLoop(Draw);

}

Результат:

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

Решение

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include<time.h>

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <math.h>

int flag0=1;

int flag1=1;

int flag2=1;

int flag3=1;

unsigned int image1_ID;

AUX_RGBImageRec* image1;

void CALLBACK resize (int width, int height)

{

glViewport (0,0,width, height);

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

glOrtho(-6,6,-6,6, -20,20);

gluLookAt(1,-1,1, 0,0,0, 0,0,1);

glMatrixMode(GL_MODELVIEW);

}

void CALLBACK Draw (void)

{

static double time0=0;

static double time1=0;

static double time2=0;

static double time3=0;

GLUquadricObj *quadObj;

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3d(1,1,1);

float pos[4]={3,-3,5,1};

glLightfv(GL_LIGHT0, GL_POSITION, pos);

glEnable(GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_DEPTH_TEST);

quadObj = gluNewQuadric();

float s=0.9-(time0/800);

if (s<0.01 && flag0==1)

{flag0=2;}

if (s>0.9 && flag0==2)

{flag0=1;}

if (flag0==1)

{time0++;}

else

{time0--;}

const float p[4]={0,0,s,0};

glPushMatrix();

glEnable(GL_TEXTURE_2D);

glEnable(GL_TEXTURE_GEN_S);

glEnable(GL_TEXTURE_GEN_T);

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

glTexGenfv(GL_T,GL_OBJECT_PLANE,p);

glRotated(-180,1,0,0);

glTranslated(0,0,-3);

glColor3d(1,1,0);

gluCylinder(quadObj, 1, 1, 3, 50, 50);

glDisable(GL_TEXTURE_GEN_S);

glDisable(GL_TEXTURE_2D);

glPopMatrix();

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glPushMatrix();

glEnable(GL_ALPHA_TEST);

glEnable(GL_BLEND);

double z1=time1/300;

glRotated(time1,0,0,1);

glTranslated(1.3,0,1);

glTranslated(0,0,z1);

if (z1>2 && flag1==1)

{flag1=2;}

if (z1<-1 && flag1==2)

{flag1=1;}

glColor4d(0,1,0, 0.1);

auxSolidSphere(0.2); //s1

glDisable(GL_BLEND);

glDisable(GL_ALPHA_TEST);

if (flag1==1)

{time1++;}

else

{time1--;}

glPopMatrix();

glPushMatrix();

glEnable(GL_ALPHA_TEST);

glEnable(GL_BLEND);

double z2=time2/600;

glRotated(time2*2,0,0,15);

glTranslated(1.8,0,1);

glTranslated(0,0,z2);

if (z2>2 && flag2==1)

{flag2=2;}

if (z2<-1 && flag2==2)

{flag2=1;}

glColor4d(1,0,0, 0.1);

auxSolidSphere(0.2); //s2

glDisable(GL_BLEND);

glDisable(GL_ALPHA_TEST);

if (flag2==1)

{time2++;}

else

{time2--;}

glPopMatrix();

glPushMatrix();

glEnable(GL_ALPHA_TEST);

glEnable(GL_BLEND);

double z3=time3/400;

glRotated(time3*3,0,0,1);

glTranslated(2.3,0,1);

glTranslated(0,0,z3);

if (z3>2 && flag3==1)

{flag3=2;}

if (z3<-1 && flag3==2)

{flag3=1;}

glColor4d(0,0,1, 0.2);

auxSolidSphere(0.2); //s3

glDisable(GL_BLEND);

glDisable(GL_ALPHA_TEST);

if (flag3==1)

{time3++;}

else

{time3--;}

glPopMatrix();

gluDeleteQuadric(quadObj);

auxSwapBuffers();

}

void main ()

{

auxInitPosition (100,100,800,800);

auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

auxInitWindow ("v11_07");

glTranslated(0,0,-1);

glEnable (GL_COLOR_MATERIAL); // установка свойств материала

image1 = auxDIBImageLoad("v11_07.bmp");

glGenTextures(1, &image1_ID);

glBindTexture(GL_TEXTURE_2D, image1_ID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, 3,

image1->sizeX,

image1->sizeY,

0, GL_RGB, GL_UNSIGNED_BYTE,

image1->data);

auxIdleFunc (Draw);

auxReshapeFunc (resize);

auxMainLoop(Draw);

}

Результат:


1. Диплом на тему Условия развития интеллектуальных процессов младших школьников средствами компьютерного обучения
2. Реферат The Washington Post
3. Реферат на тему Особенности и основные черты японского менеджмента
4. Курсовая Літаратура першай паловы XVI ст.
5. Реферат Апулум
6. Реферат на тему ContribOf Paint In Mid Age Essay Research
7. Курсовая на тему Аудиторская проверка расчетного валютного и прочих счетов в банках
8. Диплом Анализ ассортимента, определение уровня качества карамели и коммерческая работа по организации х
9. Реферат Атопический дерматит 2
10. Реферат на тему Robert Frost Essay Research Paper It has