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)
{
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);
}
Результат:
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)
{
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);
}
Результат:
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 | 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);
}
Результат:
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 | 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);
}
Результат:
... согласно заданному алгоритму. Все ошибочные ситуации были рассмотрены, ошибки – устранены. 4. Применение программы 4.1 Назначение программы Программа предназначена для создания и редактирования сложных графических эффектов частиц. В процессе разработки была обеспечена реализация программой следующего набора функций: - управление динамическим набором эмиттеров (систем частиц); - ...
... средств. К примеру, Adobe Photoshop сейчас не является чисто растровым редактором, a CorelDRAW имеет довольно развитые средства работы с растровой графикой. 2. Графические редакторы, используемые для создания векторных и растровых изображений Редакторы растровой графики Microsoft Paint - простой (или лучше сказать - простейший) редактор, входящий в стандартную поставку операционных систем ...
... представляют собой числа с плавающей точкой. Наличие различных форматов позволяет библиотеке OpenGL принимать данные пользователя в его собственном формате данных. Некоторые команды библиотеки OpenGL допускают использование 8 различных типов данных в качестве своих параметров. Буквы, используемые в качестве суффиксов для того, чтобы определить эти типы данных для реализации ISO С библиотеки ...
... 1. Постановка задачи Целью данной курсовой работы является получение практических знаний по курсу компьютерная графика. С помощью возможностей OpenGL будет создана модель управления элементами поверхности. Задачами является изучение основных возможностей создания трехмерных объектов, наложения текстур, работа с координатами. 2. Описание алгоритма решения задачи Для ...
0 комментариев