на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Создание компьютерной графики при помощи OpenGL

Создание компьютерной графики при помощи OpenGL

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

1.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)

AUX_DOUBLE);

auxInitWindow("v11_01_1");

glTranslated(0,-4,0);

auxReshapeFunc(Reshape);

auxMainLoop(Draw);

Результат:

2.2 с помощью линий

Решение:

#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)

AUX_DOUBLE);

auxInitWindow("v11_01_1");

glTranslated(0,-4,0);

auxReshapeFunc(Reshape);

auxMainLoop(Draw);

Результат:

2. Нарисуйте каркас призмы, в основании которой лежит правильный 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

Результат:

3. Напишите программу вывода графика функции 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

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);

}

Результат:

4. Напишите программу вывода вращающего тора относительно своей оси 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);

Страницы: 1, 2



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.